第二季-专题9--代码搬移不可少

专题9--代码搬移不可少

  1. ARM启动流程回顾

假设都是从nand flash启动的

2440:从nand flash启动需要垫脚石(SRAM)的作用,垫脚石只有4kb。u-boot的大小一般就有100kb左右,垫脚石先将nand flash中的4kb内容拷贝其中,之火垫脚石将多余的内存拷贝到内存中。

6410:它一上电就会在SROM中运行bootloader0,将nand flash中的8kb拷贝到内存(SRAM)中,利用这8kb的内存将剩余的内存全部拷贝。

210;它本身也有烧写好的bootloader0(在SROM中),拷入垫脚石之后,先将nand flash中的内容拷贝到IRAM中(96kb),当96kb大小不够时,再将所有的内容拷贝到内存中。

2440、6410和210的垫脚石都不能满足bootloader的大小,需要代码的搬移。

  1. 代码搬移编程

(1)起点:SRAM(0地址处开始),也就是垫脚石。

我们自己编写的bootloader大小不到4KB,在第一步会全部搬移进入SRAM垫脚石之中。实际上这样可以直接就在垫脚石中运行,但是为了显示过程,我们还是将它放在内存中运行。

垫脚石的起始地址在不同开发板之间是不同的。

2440:0x0000000

6410:0x0C000000

210:0xD0020000

(2)终点

连接地址:

在我们使用链接器脚本的时候,我们会在开头(以2440为例)加上. = 0x30000000,使用反汇编指令,我们会开到在_start之前就显示这个地址。当程序执行到这一步的时候,就会将这个值传给PC指针。

绝对跳转:

         直接修改PC指针这种跳转。

相对跳转:

         b和bl用的就是间接跳转,不是讲跳转的地址直接赋值给pc指针,而是将跳转之间的差值加给pc指针。

(3)程序:

reset:

         bl set_svc

         bl disable_watchdog

         bl disable_interrupt

         bl disable_mmu

         bl init_clock

         bl init_sdram

         bl copy_to_ram

         bl light_led

copy_to_ram:

         ldr r0, =0x0   @起点

         ldr r1, =0x30008000    @终点

         add r3, r0, #1024*4   @假设复制4Kb的内容

copy_loop:               @循环语句

         ldr r2, [r0], #4    @读出来

         str r2, [r1], #4    @写进去

         cmp r0, r3       @对比

         bne copy_loop    @没完成复制的话重新循环

         mov pc, lr

猜你喜欢

转载自www.cnblogs.com/free-1122/p/11452037.html