wangtao03 发表于 2010-8-19 14:48:22

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

wangtao03 发表于 2010-8-19 23:58:16

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中执行了呢?

ustcls 发表于 2010-8-20 11:04:11

看一下vivi.lds就明白了

wangtao03 发表于 2010-8-20 14:19:09

我明白了


首先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]
查看完整版本: vivi里面的 ARM boot loader