【问题标题】:Linker : how to place a block of data at a specific address boundary链接器:如何将数据块放置在特定地址边界
【发布时间】:2011-12-07 01:14:27
【问题描述】:

这可能是一个简单的问题,但我是 GNU GCC 链接器文件的初学者(codesourcery arm-none-eabi ver 4.5.2)。

我必须在 ARM7 处理器和数据表中初始化 Mmu,据说 Mmu 页表必须位于 16kbyte (2^14) 边界。

目前我已经有了这个解决方案,但我几乎可以肯定这不是更有效的解决方案!

ENTRY(_start)

SECTIONS
{
 . = 0x0;
 .text : {_stext = .;
*startall.o (.text)
. = 0x4000;
*MmuSdram0.o (.text)
*(.text)
_etext = .;}
 .data : {_sdata = .;
*(.data) 
_edata = .;}
 .bss : {_sbss = .;
*(.bss) 
_ebss = .;}
}

startall.o 是一个包含处理器初始化的汇编文件。
下一行,我将地址设置为 0x4000(2^14 的边界)。
MmuSdram0.o 包含 Mmu 页表。
然后按照固件的其余部分进行操作。
显然,这个解决方案让我在 startall 的结尾和 0x4000 之间有一个差距,我浪费了内存空间(我不喜欢浪费 ;-)

我会做的是将页表放在 *(.text) 之后,但我不知道该怎么做:
*(.text) “除了” MmuSdram0.o
而且我更喜欢让链接器将页表放置在下一个可用的 2^14 边界,而不是自己修复地址。我检查了链接器文档,找到了 ALIGN 命令,但我不确定如何正确使用它,或者这是否适合我需要的命令...

提前致谢!

【问题讨论】:

  • 我很惊讶没有人回答这个问题,这不是一个简单的问题吗?

标签: gcc linker alignment mmu


【解决方案1】:

嗯,把__attribute__ (( aligned(16*1024) ))放在分号';'之前你的 mmu 表声明

【讨论】:

  • 这种方式的缺点,恕我直言,gcc 将为您的 mmu 表保留所有 16 KB。也就是说,如果您的 mmu 表的大小不是 16 KB,那么您将浪费其余部分。事实上,在不修改链接描述文件的情况下,我正在努力寻找解决方案。
  • 更准确地说,表格是在汇编文件中定义的,所以我在定义表格之前放了一个 .align 14 并且它起作用了。
猜你喜欢
  • 2013-11-15
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多