在考虑为什么要重定位的问题之前,咱们首先要了解一下几点:
1. 链接地址的界说:我自己了解是,程序被界说的开端履行的内存地址。
2. 当ARM从nandflash发动的时分,CPU所做的作业是将nandflash中的前8K代码主动的到6410的0地址(即Stepping Stone)中去,然后从0地址开端履行程序。
3. 程序在履行过程中,用链接地址来拜访全局变量。全局变量一般被存放于程序的最后面。
在程序超越8K时,假如不进行重定位,就会产生类似于下面的拜访过错,这将导致程序无法正常履行。
假定咱们界说程序的链接地址为0x50000000,程序从6410的0地址(即Stepping Stone)履行的时分,假如要拜访某个全局变量时,假定其反汇编代码如下:
500000a4 e59f303c ldr r0, [pc, #60] ;r0 = [0x500000e8] =0x00000200
500000a8 e5933000 ldr r0, [r0] ;r0 = [0x00000200]
500000ac ……
……
500000e8 00000200 …….
00000200 :
200: 00000000 ……
咱们能够看出来,r0的值要根据地址0x500000e8处取得,而在Stepping Stone中无法找到0x500000e8这个地址,这样程序就会犯错。所以在程序被CPU拷贝到Stepping Stone后,咱们要先写一段程序初始化nandflash和内存,再利用方位无关的代码将程序从nandflash拷贝到内存中,然后跳转到其它函数持续履行,这便是ARM的重定位。