原创 u-boot 关于代码搬移

2008-6-21 15:14 3231 3 3 分类: MCU/ 嵌入式

对u-boot启动代码start.s(汇编部分)的注解。


需要注意的是代码的搬运过程。


对于从nandflash启动的s3c2410,上电后会自动从nandflash搬移4k代码(肯定包含start.s部分)到0地址的缓存(bootstone)中,然后从0地址开始读取指令并运行。那么这4k的代码必须实现必要的初始化和u-boot代码的搬移(到sdram中),最后u-boot将在sdram中运行。


u-boot默认是从norflash或sdram中启动运行的。原版的start.s对于代码搬移的实现如下:


1,首先读取_start的地址值(相对pc的值,特别注意adr伪指令)和_TEXT_BASE地址处TEXT_BASE的值(在连接脚本中定义的常数),以判别程序从哪里运行,是否需要搬移。


relocate:               /* relocate U-Boot to RAM       */<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


    adr r0, _start      /* r0 <- current position of code   */


    ldr r1, _TEXT_BASE      /* test if we run from flash or RAM */


    cmp     r0, r1                


    beq     stack_setup


 

2,如果需要,搬移所有整个代码段到sdram(TEXT_BASE地址处)。下面用于计算代码段长度和代码段终止地址。


 


    ldr r2, _armboot_start


    ldr r3, _bss_start


    sub r2, r3, r2      /* r2 <- size of armboot            */


    add r2, r0, r2      /* r2 <- source end address         */


 

3,如果是从nandflash启动,上述实际上只有效搬移了4k的代码到sdram,因为u-boot代码段大部分还在nandflash中。所以需要添加从nandflash拷贝到sdram的代码。这里由copy_myself函数实现,再次搬移了128k,并且覆盖了前次搬移的4k。


 


     bl    copy_myself


 


4,搬移完成后,程序必须跳到sdram中去运行。注意下面的ldr伪指令,得到on_the_ram的绝对地址(连接完成后就是个常数值,位于sdram中),然后赋值给pc。


 


    @ jump to ram


      ldr   r1, =on_the_ram


      add   pc, r1, #0


 


5,跳到start_armboot(),运行第一跳c指令。这里的ldr是普通指令,_start_armboot标号处存储了start_armboot()函数的绝对地址(连接完就是个常数)。到此start.s的工作完成。


    on_the_ram:


    #endif


    /*end add*/


 


        ldr pc, _start_armboot


 


    _start_armboot: .word start_armboot


 


点击下载

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条