uboot重定位代码分析(转)

原创 2013年12月02日 09:12:38

概述

重定位(relocate)代码将BootLoader自身由Flash复制到SDRAM,以便跳转到SDRAM执行。之所以需要进行重定位是因为在Flash中执行速度比较慢,而系统复位后总是从0x00000000地址取指。

重定位代码,位于/U-Boot/cpu/s3c44b0/start.S 

relocate:                

    adr r0, _start    

    ldr r1, _TEXT_BASE    

    cmp     r0, r1        

    beq     stack_setup

 

    ldr r2, _armboot_start

    ldr r3, _bss_start

    sub r2, r3, r2    

    add r2, r0, r2    

 

copy_loop:

    ldmia r0!, {r3-r10}     

    stmia r1!, {r3-r10}     

    cmp r0, r2               

    ble copy_loop

以上代码首先判断是否需要进行重定位,如果需要的话首先确定复制的源基址、源大小和目标基址,然后以r3 ~ r13为媒介,将BootLoader复制到SDRAM中。

分析

copy_loop很容易理解,这里主要分析relocate处的前两条指令:

1.       adr r0, _start

adr是一条伪指令,汇编器总是试图为它产生add/sub这样的指令,(在这里)以pc为基址装载目标寄存器。以下是arm-elf-objdump产生的反汇编代码:

c700048:   e24f0050  sub r0, pc, #80   ; 0x50

e24f0050是指令对应的机器码,c700048是存放该机器码的地址(十六进制表示)。这个地址是怎么来的呢?在/U-Boot/config.mk中有问题的答案:

LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)

上面的宏指定连接时的命令行参数,-Ttext设定了.text段的地址,而TEXT_BASE/U-Boot/board/.../config.mk中定义为0x0C700000。这些信息最后都以硬编码的方式记录在程序映像文件中,程序的入口_start = TEXT_BASE = 0x0C700000 

Disassembly of section .text:

0c700000 <_start>:

 c700000: ea00000a  b   c700030
 ...

但是,程序映像是烧写到Flash中并开始执行的,而Flash的地址从0x00000000开始。于是,程序映像的第一条指令对齐到0x00000000处。相应的,这条adr指令的地址应对齐到0x00000048处,执行后r0等于0

2.       ldr r1, _TEXT_BASE

以下是arm-elf-objdump产生的反汇编代码:

c70004c:   e51f1034  ldr r1, [pc, #-52]    ; c700020 <_TEXT_BASE>

由此可见,这里的ldr并不是简单的将_TEXT_BASE地址处的4字节装载到r1,而同样是以pc为基址计算得到源地址的。这里的pc = 0x4c + 8 = 0x54,于是该指令把0x54 – 52 = 0x20处的4字节(即TEXT_BASE,亦即0x0C700000)装载到r1

3.       源大小的确定

通过上面的分析,我们已经有了一个概念:程序的实际执行地址与连接时指定的加载地址可能是不一样的。我们已经得到BootLoader代码开始的运行时开始地址,存放于r0,还需要计算它的运行时结束地址。运行时结束地址 = 运行时开始地址 + 代码段大小。代码段大小由.bss段的期望开始地址 - .text段的期望开始地址获得。

小结

通过连接时的-Ttext选项,将.text段的地址硬编码到程序映像中。虽然程序映像在Flash中执行,其实际执行地址与期望执行地址不一致,但在relocate之前,通过以pc为基址进行相对寻址,使得这些代码的执行与其实际装载的地址无关。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ARM Uboot经历——Uboot代码重定位

Uboot重定位是uboot启动后的一个重要功能,重定位的目的是为了让uboot运行在速度性能更好的RAM上,一般是从外部RAM搬移到内部RAM。重定位这块说简单也简单,说复杂也复杂,主要涉及到编译和...

uboot的relocation原理详细分析

所谓的relocation,就是重定位,uboot运行后会将自身代码拷贝到sdram的另一个位置继续运行,这个在uboot启动流程分析中说过。 但基于以前的理解,一个完整可运行的bin文件,link时...

uboot搬移部分和重定位部分的代码分析

来看一下搬移部分和重定位部分的代码: relocate: /* 把U-BOOT重新定位到RAM*/          //r0=0; adr r0, _start /* r0是代码的当前位...

u-boot中重定位

在学习 u-boot的时候,对程序重定位不理解,不知道为什么要进行重定位,在网上查找资料学习了一下。 首先,要了解一下一个程序的生成的四个步骤:预处理、编译、汇编、链接。经过这四步,最终才生成可执行文...

u-boot重定位

http://blog.sina.com.cn/s/blog_7656589b0100ys1l.html zhu 概述 重定位(relocate)代码将BootLoader自...

U-BOOT-2016.07移植 (第三篇) 代码重定位

U-BOOT-201607移植 第三篇 代码重定位 1.分析board_init_f 2.分析relocate_code

U-Boot重定位代码分析

概述 重定位(relocate)代码将BootLoader自身由Flash复制到SDRAM,以便跳转到SDRAM执行。之所以需要进行重定位是因为在Flash中执行速度比较慢,而系统复位后总是从0x0...

U-Boot重定位代码分析 (学习u-boot时网上搜到的一篇文章,感觉挺给力的)

概述 重定位(relocate)代码将BootLoader自身由Flash复制到SDRAM,以便跳转到SDRAM执行。之所以需要进行重定位是因为在Flash中执行速度比较慢,而系统复位后总是从0x0...

UBOOT之源码分析(X4412)——代码重定位

参考http://blog.csdn.net/xieweihua2012/article/details/8474655根据X4412
  • yakehy
  • yakehy
  • 2014年09月15日 17:03
  • 433

S5pv210uboot启动第一阶段分析之地址重定位和跳转。

这是uboot启动的第一阶段,我们可以发现,我们来分析一下uboot的第一阶段地址问题:我们知道在编译的时候我们进行了地址的重定位,但是下载的时候我们显然是下载到了flash里面,在开机的时候由控制器...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uboot重定位代码分析(转)
举报原因:
原因补充:

(最多只允许输入30个字)