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

posted @ 2017-06-29 20:31  郁兴力  阅读(201)  评论(0)    收藏  举报