部分加载器脚本中的加载地址和执行地址

时间:2013-04-09 20:39:18

标签: ld linker-scripts bare-metal

我正在为裸机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
}

2 个答案:

答案 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的错误使概念/问题相似。