日期:2014-05-16  浏览次数:20715 次

uboot怎么判断当前运行于RAM中?
在6410的uboot中有以下一段代码:

bl lowlevel_init /* go setup pll,mux,memory */

/* when we already run in ram, we don't need to relocate U-Boot.
 * and actually, memory controller must be configured before U-Boot
 * is running in ram.
 */
ldr r0, =0xff000fff
bic r1, pc, r0 /* r0 <- current base addr of code */ 当前PC是多少?为什么要清楚r0中相应位为1的位?
ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */ _TEXT_BASE在那里,为什么_TEXT_BASE的值如何决定
bic r2, r2, r0 /* r0 <- current base addr of code */
cmp r1, r2 /* compare r0, r1 */
beq after_copy /* r0 == r1 then skip flash copy */




S3C6410datasheet地址如下:

DRAM Controller of the Memory Port1 :
  Address Size(MB)  
0x5000_0000 0x5FFF_FFFF 256MB 
0x6000_0000 0x6FFF_FFFF 256MB



1、当前PC是多少?为什么要清楚r0中相应位为1的位?

2、_TEXT_BASE在那里,为什么_TEXT_BASE的值如何决定?

3、假设物理地址为0x50000000(大小为256MB)在linux中应该映射到多少去?




------解决方案--------------------
uboot使用的是物理地址 
pc就是当前执行指令的物理地址,也就是当前指令被从那个物理地址取出来的,熟悉微机原理神马的,就不会对pc陌生
因为ram和各种rom的物理地址不同,而且ram在arm上还是固定的物理地址,所以判断pc就能知道当前代码是否在ram运行

_TEXT_BASE 在老版的uboot里藏在.mk文件里,新版放在配置头文件中,其实就是一个宏
_TEXT_BASE 表示的uboot镜像在目标系统上被烧写的起始物理地址

问题3 不知。因为物理内存最终会被映射成很多块,而且不同体系结构都有差异,至今我也没有完全搞清。