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:

.wordTEXT_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 b33f80050 <start_code>

33f80004:e59ff014 ldrpc, [pc, #20]; 33f80020 <_undefined_instruction>

33f80008:e59ff014 ldrpc, [pc, #20]; 33f80024 <_software_interrupt>

33f8000c:e59ff014 ldrpc, [pc, #20]; 33f80028 <_prefetch_abort>

33f80010:e59ff014 ldrpc, [pc, #20]; 33f8002c <_data_abort>

33f80014:e59ff014 ldrpc, [pc, #20]; 33f80030 <_not_used>

33f80018:e59ff014 ldrpc, [pc, #20]; 33f80034 <_irq>

33f8001c:e59ff014 ldrpc, [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中的空间存储结构如下图所示: 

 

版权声明:本文为ljf181275034原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ljf181275034/articles/2800064.html