本文基于国嵌的视频教程和TQ2440开发板,总结一下ARM如何实现代码的搬移。
一般来说,我们的uboot程序都是下载至NAND FLASH中。系统一上电,就会自动将NAND FLASH中的代码搬移至内存中,首先会搬移4KB的程序至我们的垫脚石SRAM区域内。但就我们自己设计编写的Gboot程序,我们代码量的size不需要4KB的大小。因此,本实验中主要是将垫脚石的代码搬移至链接器脚本定义的链接地址处。这样一来,我们搬移的起点就是内存的起始地址:0x00000000,终点就是链接器脚本定义的0x30008000.采用一个循环结构实现代码的搬移,具体代码如下:
copy_to_ram:
ldr r0,=0x00000000 @start address
ldr r1,=0x30008000 @final address
add r3,r0,#1024*4 @set the copy code size
copy_loop: @copy loop
ldr r2,[r0],#4
str r1,[r2],#4
cmp r0,r3
bne copy_loop
mov pc,lr
至于为什么PC指针一上电不是指着我们定义的起始地址:0x30008000呢?这主要是因为在指针一上电指向的必然是0x00000000地址,但由于我们运行程序采用的相对寻址方式,并不会直接改变PC的值,因此其地址变化方式为当前PC值+差值。所以PC指针不会指向0x30008000地址处。
具体可参考ARM相关技术手册以及国嵌培训视频。