Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / U-Boot从ROM拷贝到RAM

U-BOOT从ROM拷到RAM详见start.S
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    ldr    r2, _armboot_start
    ldr    r3, _bss_start
    sub    r2, r3, r2        /* r2 <- size of armboot            */
    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
是取得_start行在内存(Nor Flash ROM)的实际位置,_TEXT_BASE则是RAM中的位置。
实际把plain binary格式的u-boot烧写到NOR Flash运行时,需要把Nor Flash中的代码拷贝到RAM。当u-boot在NorFlash中运行时,adr r0,_start可以取得该行的实际位置。_armboot_start的值
_armboot_start:
    .word _start
此值在编译时已经决定,为0x33F80000_bss_start的值
_bss_start:
    .word __bss_start
此值在编译时已经决定,即__bss_start的值,在link script中定义。u-boot代码长度 = _armboot_start - _bss_start
u-boot代码末地址 = r2ldmia : 每次取8个word
    ldmia    r0!, {r3-r10}        /* copy from source address [r0]    */
    stmia    r1!, {r3-r10}        /* copy to   target address [r1]    */
直到r0 > r2 ,其中ble表示 <=,即r0<=r2时循环拷贝