本帖最后由 狂奔的蜗牛哥 于 2015-9-5 12:28 编辑
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
如上代码为uboot判断是从哪里启动以及代码重定位的源码,我的理解如下:
1、代码可以从nandflash启动,也可以从norflash启动;当从nandflash启动时,cpu将nandflash前4k代码加载到内部SRAM,并调到内部SRAM运行(SRAM映射到0x0地址)。当从norflash启动时,不需要加载到SRAM,直接从norflash的0x0地址运行。
2、当从nandflash启动时,开始内部的SRAM将代码拷贝到指定的链接地址 _TEXT_BASE,然后跳转到SDRAM中运行;
我的困惑:
从nandflash和从norflash启动时,
adr r0, _start /* r0 <- current position of code */
dr r1, _TEXT_BASE /* test if we run from flash or RAM */
中的_start都是0x0? ,_TEXT_BASE都是指定的0x33f80000吗? 如果不是,应该是什么? |