Linker 链接器脚本:将节与下一个二次方对齐

Linker 链接器脚本:将节与下一个二次方对齐,linker,embedded,ld,linker-scripts,Linker,Embedded,Ld,Linker Scripts,我有一个链接器脚本: MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 } SECTIONS { .kernel.text : { _kernel_text = .; KEEP(kernel.a(.isr_vector)) KEEP(k

我有一个链接器脚本:

MEMORY
{
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000
}
SECTIONS
{
    .kernel.text :
    {
        _kernel_text = .;
        KEEP(kernel.a(.isr_vector))
        KEEP(kernel.a(_sbrk))
        kernel.a(.text*)
        kernel.a(.rodata*)
        _kernel_etext = .;
        _kernel_flash_data = ALIGN(0x4);
    } > FLASH

    .kernel.data : /*AT(ADDR(.text) + SIZEOF(.text))*/ /*contains initialized data*/
    {
        _kernel_data = .;
        kernel.a(vtable)
        kernel.a(.data*)
        _kernel_edata = .;
    } > SRAM AT > FLASH

    .kernel.bss : 
    {
        _kernel_bss = .;
        kernel.a(.bss*)
        kernel.a(COMMON)
        _kernel_ebss = .;
    } > SRAM

    .core.text : ALIGN(0x1000) 
    {
        _core_text = .;
        core.a(.text*)
        core.a(.rodata*)
        _core_etext = .;
        _core_flash_data = ALIGN(0x4);
    } > FLASH
 /* There is lots more, but this is the interesting part */
}
让我们聚焦在闪光灯上。闪存从0x0开始,首先将整个kernel.text写入闪存,然后将kernel.data写入闪存。我想要一个MPU来保护这个内存区域。此MPU只能在大小为二次方的内存段上工作。我希望闪存中的整个内核部分(数据+文本)由MPU保护在单个区域下,因此我需要它的总大小为2的幂。现在,.core.text上的align命令可以帮我完成这项工作。我知道一个事实,即.kernel.text+.kernel.data=3960字节长,所以我想对齐到2^12=4096=0x1000。现在我可以在单个区域下保护0x0到0x1000,并在单个MPU区域下保护内核。开派对

但项目还远未完成,代码将被添加,因此我们可能会跨越这一界限。第一次这不是问题:内存将与下一个4096屏障对齐,即8192和2^13。但在那之后,内存将与12288对齐,这不是二的幂,所以我的MPU会朝我吐口水,嘲笑我


有没有办法使这个链接器脚本始终与下一个二次方对齐?

谢天谢地,GNU ld为这样的实例提供了一个方便的函数。只需按如下方式编写链接器脚本:

/* ... */
_flash_text_data_end_aligned = (2 << LOG2CEIL( _etext + SIZEOF(.data)));
/* ... */
.core.text: ALIGN(_flash_text_data_end_aligned)
/* ... */
/**/

_flash_text_data_end_aligned=(2)您确定:此MPU只能在大小为二次方的内存段上工作吗?您正在编程哪个MPU?我使用的是Stellaris LM4F120H5QR微控制器,您可以在其数据表的第187页上找到此信息,其中说明区域大小计算为2^(大小+1),其中size是一个5位寄存器,您需要自己编写它。因此,您只能编写2次方的大小。