您的位置:首页 > 编程语言

uboot搬移部分和重定位部分的代码分析

2012-10-10 09:54 316 查看
来看一下搬移部分和重定位部分的代码:

relocate: /*
把U-BOOT重新定位到RAM*/

//r0=0;

adr r0, _start /* r0是代码的当前位置*/

ldr r1, _TEXT_BASE /*测试判断是从FLASH启动,还是RAM
*///r1=TEXT_BASE = 0x33F80000

cmp r0, r1 /*比较R0、R1,调试的时候不需要重定位。
*/

//如果当前的位置就是0x33F80000,既然uboot能够正常执行,起始地址肯定是0x33F80000,所以如果起始地址等于0x33F80000,那肯定现在是从norflash中启动的。

beq stack_setup /*如果R0等于R1,跳到重定位代码。*/

//如果不是从RAM运行的话,则将代码拷贝到_TEXT_BASE标识的RAM中。

/*准备重新定义代码。*/

ldr r2, _armboot_start//_armboot_start=_start

ldr r3, _bss_start //

sub r2, r3, r2 /* r2得到armboot的大小*/

add r2, r0, r2 /* r2得到要复制代码的末尾地址*/

//kaobei guo cheng

copy_loop:/*重新定位代码*/

ldmia r0!, {r3-r10}
/*从源地址[r0]复制,r0指向_start(=0)*/

stmia r1!, {r3-r10}
/*复制到目的地址[r1],r1指向_TEXT_BASE(=0x33F80000)*/

cmp r0, r2 /* 复制数据块直到源数据末尾地址[r2]*/

ble copy_loop
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: