我正在为裸机ARM应用程序编写自定义链接描述文件。应用程序存储在闪存中,此时我有一个启动代码,将整个应用程序复制到SDRAM中,并继续在SDRAM中执行以达到速度目的。我想修改这个脚本直接从flash运行整个代码,但是我在理解某些元素时遇到了问题。
在下面的链接描述文件中,.ram_data
部分的执行地址为RAM
,加载地址为ROM
(SDRAM中的两个部分)。根据我的理解,链接器使用执行地址来对所有不是PC相关的元素进行符号解析,但是加载地址呢?在裸机ARM的环境中,没有程序加载器这样的东西,链接器也没有办法对我在flash中编写程序的位置产生任何影响,那么它实际上用于什么?
同样,链接器如何在运行时对SDRAM(rx)或(rw)产生影响?当我在内存区域中修改这些选项时,它实际上是否会改变任何内容?
MEMORY
{
RAM(rw) : ORIGIN = 0x00001000, LENGTH = 12M-4K
ROM(rx) : ORIGIN = 0x007f1000, LENGTH = 60K
}
SECTIONS
{
.startup :
{ ... } > VECTOR
.rom_text :
{ ... } > ROM
.ram_data :
{
_data_start = .;
*(.data*)
_data_end = .;
} > RAM AT>ROM
.ram_bss :
{ ... } > RAM
}
答案 0 :(得分:1)
根据我的理解,链接器使用执行地址对所有不是PC相关的元素进行符号解析,但是加载地址呢?在裸机ARM的环境中,没有程序加载器这样的东西,链接器也没有办法对我在flash中编写程序的位置产生任何影响,那么它实际上用于什么?
该信息存储在ELF可执行文件中,并由objcopy
等工具用于确定二进制文件(例如.bin
或.hex
)的布局方式。最终,它最终会告诉程序员将程序放在哪里。
同样,链接器如何在运行时对SDRAM(rx)或(rw)产生影响?当我在内存区域中修改这些选项时,它实际上是否会改变任何内容?
在这个特定的用例中,我认为这些标志仅供参考。它们主要用于动态加载程序。
答案 1 :(得分:1)
鉴于您的示例链接描述文件,这两个问题是相关的。
根据我的理解,链接器使用执行地址对所有不是PC相关的元素进行符号解析,但是加载地址呢?
同样,链接器如何在运行时对SDRAM(rx)或(rw)产生影响?当我在内存区域中修改这些选项时,它实际上是否会改变任何内容?
LOAD
地址很有用,因为必须将所有内容编程为 FLASH 。这就是.ram_data
应该有AT>ROM
的原因。它告诉链接器数据将从ROM / Flash中LOAD
。在这种情况下,您必须制作一些汇编程序引导代码,将其从 flash 复制到 SDRAM 。
可以通过>ROM
部分.ram_data
来回答第二个问题。如果这样做,链接器将抱怨<em>可写部分被放置在只读内存中。最好使用读/写信息标记MEMORY
部分,因为它可以帮助确保在正确的位置具有部分。即,它是对您为链接器提供的信息的交叉检查。
>RAM AT>ROM
而非>ROM
的错误使概念/问题相似。