韦东山嵌入式Linux学习笔记之——代码重定位004_代码重定位与位置无关码

本文介绍了嵌入式Linux中代码重定位的概念,探讨了其原因和实施步骤,并通过实例详细解释了位置无关码(PIC)的工作原理。内容包括链接脚本的编写、代码段的重定位、以及如何在重定位前后正确处理程序跳转和数据访问。
摘要由CSDN通过智能技术生成

将程序(包含可运行的代码和数据)从一个位置(flash)移动至另外一个位置运行或进行数据的读写成为代码重定位。

代码重定位的根本原因是改善某个存储介质的某些缺陷(例如存取速度,读写限制等等)。在实际中我们可以只重定位程序的某一段(如数据data段或者代码text段),或者将整个程序进行重定位。

现在考虑将整个程序重定位至SDRAM所需要的技术细节:

① 从flash中将程序复制到(重定位)SDRAM,要在链接脚本里指定程序的运行地址(runtime addr)为SDRAM的地址。

② 编译会得到一个bin文件,这个bin文件烧写至flash上后一上电要从flash的0地址开始运行,因此在data数据段之前的代码段text要完成将整个程序复制到SDRAM的任务。

③ 注意:刚一上电的时候代码还存放在flash的0地址起始的空间中,这就随之带来一个问题:链接脚本本来指定了程序应该运行的地址(runtime addr)0x300000000,但是为什么刚上电时程序在flash的0地址依旧可以运行呢?

也就是说flash中data段前面的那部分代码(重定位之前的代码)与运行地址无关,简称位置无关码。


下面开始写程序验证:

1. 首先编写链接脚本,可参考uboot的连接脚本并简单修改其内容就可以适应我们自己的单板。

SECTIONS
{
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值