专题9--代码搬移不可少
- 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)起点: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