运行地址、链接地址、加载地址、存储地址


1、概念理解

运行地址<--->链接地址:他们两个是等价的,只是两种不同的说法。

加载地址<--->存储地址:他们两个是等价的,也是两种不同的说法。

 

运行地址:程序在SRAM、SDRAM中执行时的地址。就是执行这条指令时,PC应该等于这个地址,换句话说,PC等于这个地址时,这条指令应该保存在这个地址内。

加载地址:程序保存在Nand flash中的地址

 

位置无关码:B、BL、MOV都是位置位置无关码。

位置有关码:LDR PC,=LABEL等类似的代码都是位置有关码。

2、链接脚本格式

<SECTIONS>基本命令
SECTIONS 描述输出文件的映射图 -> 输出文件各段、各文件怎么放置
一个SECTIONS命令内部包含一个或多个段,段是连接脚本的基本单元,它 表示输入文件某部分怎么放置;

格式:
SECTIONS{
  ...
secname start ALIGN(align)(NOLOAD):AT(ldadr)
{contents}>region:phdr=fill
...
}
secname:命名这个段   
contents:用来确定代码的什么部分放在这个段
start:是这个段的重定位地址,也叫运行地址。如果代码中有位置无关的 指令,程序在运行时必须放在这个地址上。
ALIGN(align):虽然指定了运行地址,但仍可以使用ALIGN(align)来指定 对齐的要求---这个对齐的地址才是真正的地址
(NOLOAD):来告诉加载器,在运行时不用加载这个段
AT(ldadr):指定这个段在编译出来的映像文件中的地址——加载地址

3、链接脚本分析

先看一个链接脚本:

SECTIONS{

 first 0x00000000 : {head.o init.o}

 second 0xB0004000 : AT(2048){leds.o}

}

链接脚本将程序分为两个段:first和second。前者由head.o和init.o组成,它的加载地址运行地址都是0,所以在运行时不需要移动代码,后者由leds.o组成,它的加载地址为2048,重定位地址为0xB0004000,这表明段second存放在编译所得的映像文件的2048处,在运行前需要将它复制到地址0xB0004000(MMU映射),将编译所得的映像文件烧入到nand flash后,head.o和init.o依次从0x00000000处存放,而leds.o存放在2048处。从nand flash启动时,cpu首先将nand flash的前4KB复制到cpu自身的ram(steppingstone)中去,这样leds.o存放在地址为2048处,而运行的时候需要将steppingstone中2048 - 4096的内容复制到sdram中起始地址0xB0004000处,从而使用ldr跳转时才会正确执行下去。


4、假若程序不位于链接地址时程序会出现什么问题

访问某些全局变量时就会出错,因为访问这些全局变量时用的是它的链接地址,我去链接地址访问你,你就必须位于链接地址上。如下图,程序应该位于SDRAM上的某个地方,但是一上电是从2440的片内4K RAM 的0地址开始执行的,为什么从0地址执行的一小段代码能够正确运行,这一小段代码用到位置无关码写



  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Linux的加载地址链接地址是不同的概念。加载地址指的是程序在内存中的实际地址,也就是程序加载到内存后在内存中的位置。而链接地址指的是程序在编译和链接过程中使用的地址,它是相对于程序的编译和链接的环境而言的。 在Linux中,链接地址是由连接器(ld)根据连接脚本(.lds文件)中的指定来确定的。连接脚本中可以定义各个对象文件在内存中的存储位置和运行地址。通过连接脚本,可以将不同的模块链接到特定的地址上。 加载地址是指程序在运行时实际加载到内存的地址。如果程序是在flash中运行,那么加载地址链接地址是相同的,因为程序直接从flash中加载到内存中执行。如果程序是在ram中运行,但是存储在flash中,那么加载地址指向flash,而运行地址指向ram。在这种情况下,程序需要在运行前将相关代码从flash复制到ram中才能执行。 因此,Linux的加载地址链接地址是根据连接脚本和运行环境来确定的,并且在不同的运行环境下可能会有不同的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [运行地址链接地址加载地址存储地址](https://blog.csdn.net/yeasang1104/article/details/90114493)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值