Arm 链接器脚本中的对齐

Arm 链接器脚本中的对齐,arm,alignment,linker-scripts,trezor,Arm,Alignment,Linker Scripts,Trezor,我正在看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

我正在看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字节来对齐闪存段

我想了解在编写链接器脚本时如何确定对齐方式

提前感谢您的回答

编辑:

我想我回答了我自己的问题:

1。闪存部分:

它是这样对齐的,因为它里面的向量表总是需要对齐的。这也可以从中看出。如您所见,向量表是512字节(4 x 32字)对齐的

2。堆栈部分:

根据堆栈,部分需要始终保持8字节对齐

当然,如果不是这样,请纠正我。

好的,既然确认了我的理论,我现在可以结束这个问题

1。闪存部分:

它是这样对齐的,因为它里面的向量表总是需要“32字对齐”。在Trezor的boardloader链接器脚本中也可以看到这种情况。如您所见,向量表是512字节(4 x 32字)对齐的

2。堆栈部分:

根据ARM自己的文档,堆栈部分需要始终保持8字节对齐

谢谢您的确认

您的编辑(以及您对文档的阅读!)是正确的。请随意添加一个答案并接受它——如果你已经回答了自己的问题,这被认为是完全合理的。