Part9——代码搬移不可少
前面已经详细分析过启动流程,
因为启动代码必须放到相应位置来让启动程序启动(BL1\BL2)
所以代码搬移非常重要。
我们需要解决代码搬移的起点、终点、搬移方式的问题
今天我们要讲的代码搬移的起点是SRAM(垫脚石),不是NAND FLASH
这是因为:
首先我们没有对nand flash初始化,不能对nand flash 进行代码搬移
其次因为我们自己编写的gboot远远不够4kb,所以我们不需要从nand flash 中把代码搬移到内存
现在开始搞清楚地址搬移的首地址
2440:0
6410:oxc0000000
210:0xd0020000
链接地址概念:

在编写lds文件的时候这里就是编写起始地址

而在每一行汇编语言处会有一个链接地址
作用:
1\而在执行,如reset指令时,pc指针会被赋值成reset的链接地址,0x30008058
2\如果需要执行reset函数,可以通过使用ldr pc,=reset指令来直接执行这个函数
但是我们这个b/bl reset指令是相对跳转,不会跳转到内存中
所以回过头来。我们会从30008000开始存放我们的程序,这就是代码搬移的目标点
copy_to_ram:
ldr r0,=0xc0000000
ldr r1,=0x50008000
add r3,r0,#1024*4@复制4kb的数据到内存中,因为我们不知道有多少,但肯定少于4kb
copy_loop:@开始循环的复制
ldr r2,[r0],#4@读数据到r2寄存器,然后r0+4,准备下一次读取
str r2,[r1],#4
cmp r0,r3@判断r0是否移到末尾,如果没有继续,not equal
bne copy_loop
mov pc,lr

浙公网安备 33010602011771号