[code]
/* nor copy */
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
@ ldr r1, _TEXT_BASE
ldr r1, _TEXT_PHY_BASE /* r1 <- destination */
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
b after_copy
[/Code]
其中_TEXT_BASE在uboot的board目录下相应芯片目录下的config.mk中定义。
_TEXT_PHY_BASE是由start.S开头的一个宏定义的,原型在uboot的include目录下相应芯片的头文件中定义。
_armboot_start定义在start开头,就是_start的地址;_bss_start的原型定义在uboot.lds中。
如下:
. = ALIGN(4);
__bss_start = .;
实际_bss_start就是bss段的基址,bss段是未初始化数据段,由系统自动初始化的。
关于ARM指令集的你自己去看看,我就不讲了。
上面的代码就能将你的程序从flash中搬到SDRAM中。但是这段是仅nor flash适用的,nand flash实际是调用C程序进行copy。
因为nor flash是块存储设备,nand flash是IO设备,需要先驱动起来,有一点区别。
具体的可以找uboot源码看看,对你理解底层很有帮助的。