19.裸板--代码重定位

代码重定位解析_简单博客-CSDN博客_代码重定位

位置无关码、位置有关码、链接地址、加载地址_漫不经心-CSDN博客

芯片内置sram空间不够,CPU无法直接访问nand_flash,nor_flash不能直接写,都导致不能在存储代码的地方直接运行代码,需要上电开机之后把代码拷贝到sdram,把运行的地址定位于sdram上的代码上。

代码重定位需要借助连接脚本指定链接地址以及记录代码段、只读数据段、bss等段落的位置,连接脚本只能指定位置无法移动代码到链接地址处,需要在s文件中进行代码的拷贝。bss段和COMMON段不在bin文件中,需要对bss清零。

在重定位之前,S文件需要做好准备工作:关看门狗,设置时钟,设置栈,初始化sdram 。做完以上工作后才能拷贝代码进行重定位。

重定位之前代码的运行地址和链接地址不相同,重定位过程中函数的跳转必须使用位置无关码。位置无关码只以来当前PC进行一定的偏移,只要PC在最开始运行的区域(片内sram或者nor),无论如何调用C函数,PC始终在原运行的区域,而不会跳到sdram里(位置相关码跟链接地址相关,设置不同的链接地址,跳转地方都不同,此处连接脚本是定在sdram里的)。

假设重定位的时候使用位置相关码,运行某个C函数时跳转到sdram,此时还没完全拷贝重定位完成,很有可能拷贝的时候把那个C函数存放于sdram的参数覆盖掉。

而使用位置无关码,跳转某个C函数时,仍然在代码运行的区域(可能片内sram,也可能是nor),拷贝代码是在sdram中,并不会妨碍代码的运行,重定位完之后,再用位置相关码跳转到sdram,让此后的运行处于sdram中。

位置无关码使用b/bl跳转,不能使用全局变量,

ldr r0, =xxx  中的xxx必须是立即数,使得等同于mov r0,#xxx,伪汇编不是位置无关码

ldr r0 ,xxx 是位置无关码

ldr pc,=xxx是位置有关码,重定位完毕之后可以使用该命令直接跳转到运行的位置开始程序运行

拷贝代码

 清除bss段 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值