分类: 嵌入式
2012-04-07 10:08:05
uboot代码重定向
start.S中判断是否在内存中运行代码:
点击(此处)折叠或打开
这里比较_start和_TEXT_BASE的是否相同来判断程序是否在内存中运行。adr伪指令是把_start处地址给r0,ldr指令时把_TEXT_BASE处的值给r1。
_TEXT_BASE:
.word TEXT_BASE
查看源码可以知道_TEXT_BASE处的值为TEXT_BASE,那TEXT_BASE的值又是多少呢?查看移植时自己在board下创建的目录borad/xxx/xxx/config.mk,只有一行代码:
TEXT_BASE = 0x33F80000
在这里定义了TEXT_BASE的值。顶层Makefile会把TEXT_BASE作为u-boot.bin的链接地址。u-boot ELF格式可执行文件反汇编文件如下:
u-boot: file format elf32-littlearm
Disassembly of section .text:
33f80000 <_start>:
33f80000: ea000012 b 33f80050
33f80004: e59ff014 ldr pc, [pc, #20] ; 33f80020 <_undefined_instruction>
33f80008: e59ff014 ldr pc, [pc, #20] ; 33f80024 <_software_interrupt>
33f8000c: e59ff014 ldr pc, [pc, #20] ; 33f80028 <_prefetch_abort>
33f80010: e59ff014 ldr pc, [pc, #20] ; 33f8002c <_data_abort>
33f80014: e59ff014 ldr pc, [pc, #20] ; 33f80030 <_not_used>
33f80018: e59ff014 ldr pc, [pc, #20] ; 33f80034 <_irq>
33f8001c: e59ff014 ldr pc, [pc, #20] ; 33f80038 <_fiq>
......
可以看到程序的起始地址为0x33F80000。
如果uboot现在在SDRAM中运行那么_start和TEXT_BASE的值是一致的。如果uboot当前在NOR Flash中运行(从NOR Flash中启动),或者在S3C2440中的Steppingstone中运行(从NAND Flash启动),_start的地址都为0x00000000,与TEXT_BASE的值不一致。这样就可以判断是否需要复制uboot之后的代码到SDRAM了。
讲到这里有个小问题,为什么TEXT_BASE的值是0x33F80000,而不是SDRAM的最低地址0x30000000呢?查看start.S中设置栈区代码可以知道,0x30000000~0x33F80000分配给栈区、全局数据结构、以及malloc预留空间。start.S中设置栈区代码如下:
点击(此处)折叠或打开
uboot在SDRAM中的空间存储结构如下图所示: