vivi里面的 ARM boot loader
vivi里面的 ARM boot loader 的一段代码,如下 jump to ram 是怎么保证的呢?=on_the_ram 是开始的那个‘steppingstone’缓存区 还是 SDRAM 的地址? 请教大家,谢谢
bl copy_myself
@ jump to ram //here********************
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
@ get read to call C functions
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
mov a2, #0 @ set argv to NULL
bl main @ call main on_the_ram:
@ get read to call C functions
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
mov a2, #0 @ set argv to NULL
bl main @ call main
为什么上面的代码就在SDRAM中执行了呢? 看一下vivi.lds就明白了 我明白了
首先on_the_ram这个标号的地址是在编译链接时由链接器分配的可以查看VIVI.MAP 33f000ec 就是 on_the_ram在sdram中的地址。连接器首先把HEAD.这个文件链接到 0x33f00000处这是由vivi.lds这个链接脚本指定的。
另外这里的处理是要跳转到RAM中的一个很必要的步骤,因为在bl copy_myself后,vivi本身已经被复制到内存中,而在此之前,实际上运行的是被复制到2440内部的4KB SRAM中的代码(带来的限制就是在此之前的大小不能超过4KB)。add pc, r1, #0实际上是跳转到绝对地址on_the_ram,也即0x30000xxx处,此时vivi已在SDRAM中,经过此次跳转后就可以在SDRAM继续运行下去,也不再有之前的4KB限制了。
页:
[1]