uboot搬移部分和重定位部分的代码分析
2016-07-08 14:31
274 查看
来看一下搬移部分和重定位部分的代码:
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
相关文章推荐
- 刘一天@认真是一种态度 使劲的浪费,用力的后悔。 java监测方法运行时间/效率方法
- JAVA NIO使用非阻塞模式实现高并发服务器
- 高并发 php uniqid 不重复唯一标识符生成方案
- 日常记录(二)SpringMvc导出Excel
- 最常用的Eclipse快捷键
- C++ 通过DLL调用C#代码
- 使用Pyjnius 从python调用自定义Java方法
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- github 开源库汇总
- Eclipse关联android源码
- spring配置quartz定时器任务
- 逆向迭代器 reverse_iterator
- python调用Java-JPype使用介绍(一)(转)
- 编程日记
- python数据分析及数据处理相关资料
- yii框架项目的创建
- java进阶之路
- 一、Python爬虫 - 学教程【howto-urllib2】
- Eclipse Java Build Path详解
- 2016.6.30 java.util.concurrent.ExecutionException java.lang.OutOfMemoryError