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次方的大小。