Выравнивание в скриптах компоновщика

Я смотрю на скрипт компоновщика загрузчика Trezor:

/* TREZORv2 bootloader linker script */

ENTRY(reset_handler)

MEMORY {
  FLASH  (rx)  : ORIGIN = 0x08020000, LENGTH = 128K
  CCMRAM (wal) : ORIGIN = 0x10000000, LENGTH = 64K
  SRAM   (wal) : ORIGIN = 0x20000000, LENGTH = 192K
}

main_stack_base = ORIGIN(CCMRAM) + LENGTH(CCMRAM); /* 8-byte aligned full descending stack */

/* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data);
data_vma = ADDR(.data);
data_size = SIZEOF(.data);

/* used by the startup code to wipe memory */
ccmram_start = ORIGIN(CCMRAM);
ccmram_end = ORIGIN(CCMRAM) + LENGTH(CCMRAM);

/* used by the startup code to wipe memory */
sram_start = ORIGIN(SRAM);
sram_end = ORIGIN(SRAM) + LENGTH(SRAM);

_codelen = SIZEOF(.flash) + SIZEOF(.data);

SECTIONS {
  .header : ALIGN(4) {
    KEEP(*(.header));
  } >FLASH AT>FLASH

  .flash : ALIGN(512) {
    KEEP(*(.vector_table));
    . = ALIGN(4);
    *(.text*);
    . = ALIGN(4);
    *(.rodata*);
    . = ALIGN(512);
  } >FLASH AT>FLASH

  .data : ALIGN(4) {
    *(.data*);
    . = ALIGN(512);
  } >CCMRAM AT>FLASH

  .bss : ALIGN(4) {
    *(.bss*);
    . = ALIGN(4);
  } >CCMRAM

  .stack : ALIGN(8) {
    . = 4K; /* this acts as a build time assertion that at least this much memory is available for stack use */
  } >CCMRAM
}

Это можно найти здесь.

Я понимаю, что код должен быть выровнен на 32 бита ( ALIGN(4)), потому что процессор ARM может дать сбой, если он попытается получить доступ к невыровненному адресу, но я не понимаю, почему выравнивание стека составляет 8 байтов и, более того, какого черта вы делаете нужно потратить (?) 512 байт для выравнивания раздела flash?!

Я хотел бы понять, как выравнивание решается при написании сценария компоновщика.

Заранее благодарю за ответы!

РЕДАКТИРОВАТЬ:

Я думаю, что ответил на свой вопрос:

1. Раздел.flash:

Он выровнен так, потому что векторная таблица, которая находится внутри него, всегда должна быть "выровнена по 32 словам ". Это также можно увидеть в сценарии компоновщика Trezor. Как вы можете видеть, таблица векторов выровнена по 512 байт (4 х 32 слова).

2. Секция.stack:

Согласно собственной документации ARM, секция стека всегда должна быть выровнена на 8 байт.

PS Конечно, если это не так, пожалуйста, поправьте меня.

1 ответ

Решение

Хорошо, так как cooperised подтвердил мою теорию, теперь я могу закрыть этот вопрос.

1. Раздел.flash:

Он выровнен так, потому что векторная таблица, которая находится внутри него, всегда должна быть "выровнена по 32 словам". Это также можно увидеть в сценарии компоновщика Trezor. Как вы можете видеть, таблица векторов выровнена по 512 байт (4 х 32 слова).

2. Секция.stack:

Согласно собственной документации ARM, секция стека всегда должна быть выровнена на 8 байт.

Спасибо за сотрудничество!

Другие вопросы по тегам