u-boot重定位时,如果ro=0, 为什么能实现将nand flash代码搬移到sdram?

502091250 发布于 2014/03/10 09:42
阅读 251
收藏 0

1. 以官方u-boot-1.1.6,s3c2440,启动模式为外部nand flash为讨论前提。
   按照芯片手册理解,上电启动后pc = 0, nand flash最前面的4KB内容会被加载到stepping stone中,之后开始运行到relocate这里来,

Plain Text code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
relocate:                /* relocate U-Boot to RAM        */
    adr    r0, _start        /* r0 <- current position of code   */
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    cmp     r0, r1                  /* don't reloc during debug         */
    beq     stack_setup                /*jump to stack_setup if running in RAM*/
 
    ldr    r2, _armboot_start   
    ldr    r3, _bss_start   
    sub    r2, r3, r2        /* r2 <- size of armboot  r2 = __bss_start - _start*/
    add    r2, r0, r2        /* r2 <- source end address         */
 
copy_loop:
    ldmia    r0!, {r3-r10}        /* copy from source address [r0]    */
    stmia    r1!, {r3-r10}        /* copy to   target address [r1]    */
    cmp    r0, r2            /* until source end addreee [r2]    */
    ble    copy_loop


按照解释,adr r0, _start后r0 = 0,当循环运行到r0 > 4KB的时候,可用的4KB SRAM已经没有超过4KB之外u-boot代码了,那么u-boot剩余部分代码怎样被从flash搬移到sdram的?

同样,如果在s3c6410/s3c6440上,如果是iROM+nand flash/SD/MMD启动的话,adr r0, _start得到的r0是stepping stone(BL1)的开始地址,u-boot中4KB之外的是怎样被从flash搬移到sdram的?

加载中
0
Vince蓝
Vince蓝

3个月竟然没人回答啊,都怪我不经常逛国内的论坛,哈哈!

如果r0 = 0,自然是要搬移flash的代码到ram的!

首先,你得知道adr和ldr的不同。adr是取相对地址,ldr是取绝对地址,书上网上都有说的,什么意思呢?adr r0, _start执行后,r0的值有多种可能,是这么计算的,r0 = pc - (adr语句所在地址 - _start),对于同一份代码而言,括号中的值是固定的,这一点可以理解吧?pc的值在stepping stone中与在ram中是不同的,在stepping stone中,r0的值就是0,也就是硬件上电或硬件重启时的0地址,在ram中呢,则r0的值就是代码搬移到ram的起始地址。ldr r1, _TEXT_BASE执行后,r1的值只有一种可能,那就是_TEXT_BASE的值,这个是代码搬移到ram的起始地址。

所以,adr的目的就是获得代码的运行时地址。u-boot中这段代码就是为了检查代码的加载地址是否正确,如果和_TEXT_BASE一致则表示已经加载到我们想要加载到的地方,也就是我们真正想让代码运行的地方,这就是所谓的加载地址和运行时地址一致。如果加载地址和运行是地址不一致,那么代码就需要做到地址无关,否则会出错,这方面就不再具体说了。

返回顶部
顶部