重定位引入和链接脚本1

1、一个事实:大部分指令是位置有关码
位置无关码(PIC position independent code):汇编源文件被编码成二进制可执行程序时编码方式(生成的可执行程序)与位置(内存地址)无关。
位置有关编码:汇编源文件被编码成二进制可执行程序后和内存地址是有关的。

我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址),就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行。最后得到一个二进制程序理论上是和你指定的运行地址(链接地址)有关的,将来这个程序被执行时必须放在当时编译链接时给定的那个地址(链接地址)下才行,否则不能运行(叫位置无关码)。但是有个别特别的指令他可以跟指定的地址(链接地址)没有关系,也就是说这些代码实际运行时不管放在那里都能正常运行。

对比:位置无关代码要好一些,适应性强,放在哪里都能正常运;位置有关代码就必须运行在链接时指定的地址上,适应性差。位置无关码有一些限制,不能完成所有功能,有时候不得不使用位置有关码。
2、链接地址和运行地址:可能相同也可能不同
对于位置有关代码来说:最终执行时的运行地址和编译链接时指定的链接地址必须相同,否则一定出错。
我们之前的裸机程序中,Makefile中用 arm-linux-ld -Ttext 0x0来指定链接地址是0x0,这意味着我们认为这个程序将来会放在0x0这个地址去运行。
但是实际上我们运行时的地址是0xd0020010(这个地址是我们用dnw下载时指定的下载地址,所以程序被下载到这个内存地址了,也就是在这个地址运行),这两个地址看似不同,但是实际相同,这是个偶然现象,是因为s5pv210内部做了映射,把SRAM映射到了0x0地址去,我们现在写的裸机程序比较简单都是位置无关码,所以链接到那里都能运行。
分清楚两个概念:
链接地址:链接时指定的地址(指定方式:Makefile中用 arm-linux-ld -Ttext 或着链接脚本)
运行地址:程序实际运行的地址(指定方式:由实际运行时被加载到内存的那个位置说了算)
3、再解s5pv210的启动过程:三星推荐和uboot的实现是不同的
三星推荐的启动方式中:bootloader必须小于96kb并大于16kb,假定bootloader为80kb,启动过程是这样的:先开机上电后BL0运行,BL0会加载外部启动设备中的bootloader的前16kb(BL1)到SRAM中去运行;BL1运行会加载BL2(bootloader中80-16=64kb)到SRAM中(从SRAM的16kb处开始用)运行;BL2运行时会初始化DDR并且将OS般运到DDR去执行OS,启动完成。

uboot实际使用的方式:uboot大小随意,假定为200kb,启动过程是这样;先开机上电后先开机上电后BL0运行,BL0会加载外部启动设备中的的uboot的前16kb(BL1)到SRAM中去运行;BL1运行时会初始化DDR,然后将整个uboot搬运到DDR中,然后用一句长跳转(从SRAM跳转到DDR)指令从SRAM中直接跳转到DDR中继续执行uboot直到uboot完全启动。
4、现在明白为什么要重定位了吧?
原因:
链接地址和运行地址有时候必须不同,而且还不能全部用位置无关码,这时候只能重定位。
扩展:
分散加载:把uboot分成两部分(BL1和整个uboot),两部分分别指定不同的链接地址,启动时将两部分加载到不同的地址(BL1加载到SRAM,整个uboot加载到DDR),这时候不用重定位也能启动。
评价:分散加载其实相当于手工重定位。重定位是用代码自动进行重定位,分散加载是手工重定位。
*
IRAM(iram)地址映射图:*
在这里插入图片描述
S5PV210启动过程图解:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值