1、任务:在SRAM中将代码从0xd0020010重定位到0xd0024000
任务解解释;本来代码是运行在0xd0020010的,但是因为一些原因我们又希望代码实际是在0xd0024000位置运行的,这时侯需要重定位了。
注解:本练习对代码本身运行无实际意义,我们做这个重定位纯粹是为了练习重定位技能。但是某些情况重定位就是必须的,譬如在uboot中。
2、思路:
第一点:通过链接脚本将代码链接到0xd0024000
第二点:dnw下载时将bin文件下载到0xd0020010
第一点加上第二点,就保证了:代码实际下载运行在0xd0020010,但是却被链接到0xd0024000,从而为重定位奠定了基础。
当我们把代码链接地址设置为0xd0024000时,实际隐含意思就是我这个代码将来必须放在0xd0024000位置才能正确执行。如果实际运行地址不是这个地址就要出事(除非代码是PIC位置无关码),当以上都明白了后,就知道重定位的作用是:是PIC执行完之前(在代码中第一句位置有关码执行前)必须将整个代码搬移到0xd0024000的位置去执行,这就是重定位。
第三点:代码执行时通过代码前段的少量位置无关码将整个代码搬移到0xd0024000
第四点:使用一个长跳转跳转到0xd0024000处的代码继续执行,重定位完成。
长跳转:首先这句代码是一句跳转指令(ARM中跳转指令就是类似于分支指令B、BL等作用的指令),跳转指令通过给PC(r15)赋一个新值来完成代码段的跳转执行。长跳转指的是跳转到的地址和当前地址差异比较大,跳转的范围比较广。
当我们执行完代码重定位后,实际上在SRAM中有2份代码镜