uboot重定位代码分析(转)
来源:互联网 发布:ubuntu 14.04硬件要求 编辑:程序博客网 时间:2024/06/05 04:38
概述
重定位(relocate)代码将BootLoader自身由Flash复制到SDRAM,以便跳转到SDRAM执行。之所以需要进行重定位是因为在Flash中执行速度比较慢,而系统复位后总是从0x00000000地址取指。
重定位代码,位于/U-Boot/cpu/s3c44b0/start.S
relocate:
copy_loop:
以上代码首先判断是否需要进行重定位,如果需要的话首先确定复制的源基址、源大小和目标基址,然后以r3~r13为媒介,将BootLoader复制到SDRAM中。
分析
copy_loop很容易理解,这里主要分析relocate处的前两条指令:
1.
adr是一条伪指令,汇编器总是试图为它产生add/sub这样的指令,(在这里)以pc为基址装载目标寄存器。以下是arm-elf-objdump产生的反汇编代码:
c700048:
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>:
但是,程序映像是烧写到Flash中并开始执行的,而Flash的地址从0x00000000开始。于是,程序映像的第一条指令对齐到0x00000000处。相应的,这条adr指令的地址应对齐到0x00000048处,执行后r0等于0。
2.
以下是arm-elf-objdump产生的反汇编代码:
c70004c:
由此可见,这里的ldr并不是简单的将_TEXT_BASE地址处的4字节装载到r1,而同样是以pc为基址计算得到源地址的。这里的pc= 0x4c + 8 = 0x54,于是该指令把0x54 – 52 =0x20处的4字节(即TEXT_BASE,亦即0x0C700000)装载到r1。
3.
通过上面的分析,我们已经有了一个概念:程序的实际执行地址与连接时指定的加载地址可能是不一样的。我们已经得到BootLoader代码开始的运行时开始地址,存放于r0,还需要计算它的运行时结束地址。运行时结束地址
小结
通过连接时的-Ttext选项,将.text段的地址硬编码到程序映像中。虽然程序映像在Flash中执行,其实际执行地址与期望执行地址不一致,但在relocate之前,通过以pc为基址进行相对寻址,使得这些代码的执行与其实际装载的地址无关。
- uboot重定位代码分析(转)
- uboot代码重定位
- uboot搬移部分和重定位部分的代码分析
- uboot搬移部分和重定位部分的代码分析
- uboot移植---代码重定位
- UBOOT之源码分析(X4412)——代码重定位
- uboot系列之-----代码重定位(源码)
- 6410 uboot代码重定位问题
- S3C2440旧版本uboot重定位分析
- ARM Uboot经历——Uboot代码重定位
- uboot重定位详解
- uboot relocation 重定位的总结与分析
- U-Boot重定位代码分析
- U-Boot重定位代码分析
- U-Boot重定位代码分析
- U-Boot重定位代码分析
- U-Boot重定位代码分析
- uboot-2012.04.01移植到mini2440(一)启动流程、内存分布及重定位初步分析
- madplay的使用方法
- linux驱动开发的经典书籍
- SVM支持向量机一(入门)
- 修改linux内核启动logo及显示位置
- linux启动优化:mdev -s自从…
- uboot重定位代码分析(转)
- 芯片战争:英特尔苦追ARM 联发科挑战高通
- 我的博客今天0岁346天了,我领取了…
- alsa-lib及alsa-utils成功移植(原…
- 转 -ALSA 配置
- mixer音量的设置:amixer小工具的…
- uboot启动完成,kernel启动时lcd屏…
- LCD 调试总结
- 永宏B1主机2个常见问题