将程序(包含可运行的代码和数据)从一个位置(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
{