原创 今天终于明白u-boot重定位和搬移那一段代码了

2010-4-28 10:22 8394 5 5 分类: MCU/ 嵌入式

TEXT_BASE指定的是代码执行的起始地址,我们都知道UBOOT中这个值在连接脚本里指定的地址为0x33F80000,这个意思是说,U_BOOT程序中所有的代码都是基于这个基址编写的,也就说里面所有的标号啊,什么的都是基于这个地址的。


我们还知道,像mini2440的板子,你移植完U-BOOT之后,是不是要下载到norflash或者nandflash中啊,通过什么下,j-tag小板或者什么J-Link,好,假设你已经移植完了u-boot,同时把他下载到norflash中了,那么我们知道最终是要将u-boot放到SDRAM中去执行的,好了,搬移把,从norflash中将uBOOT映像搬到SDRAM中,前面已经再三强调过,U-BOOT中的代码都是基于0x33F80000地址编写的,所以你把uboot搬移到SDRAM中,也必须要搬到0x33F80000地址,uboot才能正确执行。


来看一下搬移部分和重定位部分的代码:


relocate: /* U-BOOT重新定位到RAM*/
         //r0=0;
adr r0, _start /* r0
是代码的当前位置*/
ldr r1, _TEXT_BASE /*测试判断是从FLASH启动,还是RAM  *///r1=TEXT_BASE = 0x33F80000

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


//如果当前的位置就是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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条