【问题标题】:Section load address and execution address in linker script链接描述文件中的段加载地址和执行地址
【发布时间】:2013-04-01 11:31:39
【问题描述】:

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

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

同样,链接器如何影响 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
}

【问题讨论】:

    标签: ld linker-scripts bare-metal


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的,谢谢您的回答!在这种特殊情况下,我使用了一个不读取二进制信息的手写程序员,但很高兴知道它用于此目的。
    【解决方案2】:

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

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

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

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

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

    >RAM AT>ROM 只是 >ROM 的错误使概念/问题相似。

    【讨论】:

    • 好的,谢谢!在我的例子中,这个名字有点误导,“ROM”实际上是在 SDRAM 中,来自闪存的内容被复制到 sdram 的“ROM”部分,并在 sdram 的“RAM”部分执行。所以链接器不知道闪存地址(在我的例子中是 0xffff0000),并且执行复制的启动代码是用 PC 相关指令编写的。
    • @Étienne 我明白了。好吧,在某些情况下,您实际上可以从 NOR 闪存执行(使用 SDRAM 可能会更慢)。在这种情况下,.text 保留在 flash 中,.dataflash 复制到 SDRAM。您可以通过定义 FLASH 内存区域并在该部分中列出引导加载程序对象来使您的引导加载程序代码与 PC 无关。但是,如果您的 ROMRAM 都在 SDRAM 中,则不需要使用 AT 并浪费内存。
    猜你喜欢
    • 2011-12-11
    • 2015-05-05
    • 2013-03-20
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多