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
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
相关文章推荐
- uboot搬移部分和重定位部分的代码分析
- uboot重定位代码分析(转)
- uboot重定位代码分析(转)
- UBOOT之源码分析(X4412)——代码重定位
- busybox init学习及部分代码分析
- 逆向分析之核心代码的定位
- 基于基站定位数据的商圈分析代码详细解释
- Uboot优美代码赏析1:目录结构和malkefile分析
- 内核中C代码部分#与##符号分析
- Intel 82599 ixgbe & ixgbevf CNA 卡驱动分析03——部分功能代码分析
- uboot第二阶段代码详细分析
- Uboot启动分析之stage1-Nand-Flash启动部分详解
- openssl中关于engine的部分代码分析
- HTTP代理实现请求报文的拦截与篡改10--大结局 篡改部分的代码分析
- 关于s5pv210主Makefile部分代码的分析和小的修改
- uboot杂记之搬移代码操作
- UBOOT 的 lowlevel_init.S,代码分析,底层分析,底层初始化
- Uboot 源码分析----代码整体结构分析
- 嵌入式Linux内核启动部分代码分析
- uboot移植第一天——代码分析(1)