Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244179
  • 博文数量: 37
  • 博客积分: 837
  • 博客等级: 准尉
  • 技术积分: 566
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-26 17:36
文章分类

全部博文(37)

文章存档

2012年(31)

2011年(6)

我的朋友

分类: 嵌入式

2012-04-07 10:08:05

uboot代码重定向

start.S中判断是否在内存中运行代码:


点击(此处)折叠或打开

  1. adr r0, _start /* r0 <- current position of code */
  2. ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
  3. cmp r0, r1 /* don't reloc during debug */
  4. beq stack_setup

这里比较_start_TEXT_BASE的是否相同来判断程序是否在内存中运行。adr伪指令是把_start处地址给r0ldr指令时把_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中运行那么_startTEXT_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中设置栈区代码如下:


点击(此处)折叠或打开

  1. /* Set up the stack */
  2. stack_setup:
  3. ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
  4. sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */
  5. sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo */
  6. #ifdef CONFIG_USE_IRQ
  7. sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
  8. #endif
  9. sub sp, r0, #12 /* leave 3 words for abort-stack */

ubootSDRAM中的空间存储结构如下图所示: 

阅读(2600) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~