4

我正在为裸机 ARM 应用程序编写自定义链接器脚本。该应用程序存储在闪存中,目前我有一个启动代码将整个应用程序复制到 SDRAM 中,并继续在 SDRAM 中执行以提高速度。我想修改此脚本以直接从 Flash 运行整个代码,但我无法理解某些元素。

在下面的链接描述文件中,该.ram_data段有一个执行地址RAM和一个加载地址ROM(这两个段都在 SDRAM 中)。据我了解,链接器使用执行地址来对所有与 PC 无关的元素进行符号解析,但是加载地址呢?在裸机 ARM 的上下文中,没有程序加载器之类的东西,链接器也无法影响我在闪存中编写程序的位置,那么它实际上是用来做什么的呢?

同样,链接器如何对运行时的 (rx) 或 (rw) SDRAM 产生任何影响?当我修改内存区域中的这些选项时,它实际上会改变什么吗?

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
}
4

2 回答 2

1

据我了解,链接器使用执行地址来对所有与PC无关的元素进行符号解析,但是加载地址呢?在裸机 ARM 的上下文中,没有程序加载器之类的东西,链接器也无法影响我在闪存中编写程序的位置,那么它实际上是用来做什么的呢?

该信息存储在 ELF 可执行文件中,并由诸如objcopy确定二进制文件(例如,.bin.hex)如何布局的工具使用。最终,它会告诉你的程序员将程序放在哪里。

同样,链接器如何对运行时的 (rx) 或 (rw) SDRAM 产生任何影响?当我修改内存区域中的这些选项时,它实际上会改变什么吗?

在这个特定的用例中,我相信这些标志仅供参考。它们主要用于动态加载程序。

于 2013-04-09T20:58:19.863 回答
1

鉴于您的示例链接器脚本,这两个问题是相关的。

据我了解,链接器使用执行地址来对所有与PC无关的元素进行符号解析,但是加载地址呢?

同样,链接器如何对运行时的 (rx) 或 (rw) SDRAM 产生任何影响?当我修改内存区域中的这些选项时,它实际上会改变什么吗?

LOAD地址很有用,因为必须将所有内容都编程为FLASH。这就是为什么.ram_data应该有AT>ROM。它告诉链接器数据将LOAD来自 ROM/Flash。在这种情况下,您必须编写一些汇编程序引导代码,将其从闪存复制到SDRAM

第二个问题可以通过放置部分来>ROM回答.ram_data。如果你这样做,链接器会抱怨一个可写部分被放置在只读内存中。最好MEMORY用读/写信息标记这些部分,因为它可以帮助确保您将这些部分放在正确的位置。即,它是对您提供给链接器的信息的交叉检查。

一个错误 where >RAM AT>ROMis 相反只会>ROM使概念/问题相似。

于 2013-04-09T22:22:34.487 回答