uboot重定位代码分析(转)
概述
重定位(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为基址进行相对寻址,使得这些代码的执行与其实际装载的地址无关。
uboot重定位代码分析(转)的更多相关文章
- Tiny6410之重定位代码到SRAM+4096
重定位代码 两个不同的地址概念: 对于程序而言,需要理解两个地址,一个是程序当前所处的地址,即程序运行时所处的当前地址.二是程序应该位于的运行地址,即编译程序时所指定的程序的链接地址.在Tiny641 ...
- uboot两阶段代码分析
1.启动过程特征总结(1)第一阶段为汇编阶段(start.s).第二阶段为C阶段(board.c中的start_armboot 函数)(2)第一阶段在SRAM中.第二阶段在DRAM中(3)第一阶段注重 ...
- tiny4412 裸机程序 七、重定位代码到DRAM【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37116637 一.关于DRAM 上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有25 ...
- linux从head.s到start_kernelstart_kernel之---内核重定位后分析
参考: https://biscuitos.github.io/blog/ARM-BOOT/ zImage 重定位之后实践 zImage 重定位之后,ARM 将 pc 指针指向了重定位 zImage ...
- Tiny6410之重定位代码到SDRAM
在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...
- tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37115697 一.重定向 对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运 ...
- uCGUI窗口重绘代码分析
一.概述 µC/GUI的窗口重绘是学习者理解窗口工作原理和应用窗口操作的重点.µC/GUI的窗口重绘引入了回调机制,回调机制可以实现图形系统调用用户的代码,由于图形系统使用了剪切算法,使得屏幕重绘的效 ...
- u-boot移植(四)---修改前工作:代码流程分析3---代码重定位
一.重定位 1.以前版本的重定位 2.新版本 我们的程序不只涉及一个变量和函数,我们若想访问程序里面的地址,则必须使用SDRAM处的新地址,即我们的程序里面的变量和函数必须修改地址.我们要修改地址,则 ...
- uboot搬移部分和重定位部分的代码分析
来看一下搬移部分和重定位部分的代码: relocate: /* 把U-BOOT重新定位到RAM*/ //r0=0; adr r0, _start /* r0是代码的当前位置*/ ld ...
随机推荐
- macOS Ruby版本需要升级到2.2.2以上
在安装 Ruby on Rails 时遇到问题,提示依赖 ruby 2.2.2 或更高的版本. ERROR: Error installing rails: activesupport require ...
- 给Java新手的一些建议——Java知识点归纳(Java基础部分)
写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...
- 高级C/C++编译技术之读书笔记(二)之库的概念
最近有幸阅读了<高级C/C++编译技术>深受启发,该书深入浅出地讲解了构建过程(编译.链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架 ...
- C# 报警 控制蜂鸣器发声
在C#中可以通过以下四种方式来实现蜂鸣或者报警,播放声音之类的功能.XP下对蜂鸣有用,win7下请接上扬声器. 1). Beep的报警实现 [c-sharp] view plaincopy / ...
- niosii 改变软核之后重新编译方法
操作系统:Win7 64 bit 开发环境:Quartus II 12.0 (64-Bit) + Nios II 12.0 Software Build Tools for Eclipse 使用Qu ...
- Go入门教程
本人录制的Go入门视频 20小时快速入门go语言视频:https://pan.baidu.com/s/1jJPsThk 基础编程 01.Go语言介绍02.环境搭建03.第一个Go程序 04.命名.变量 ...
- poj 3046 Ant Counting——多重集合的背包
题目:http://poj.org/problem?id=3046 多重集合的背包问题. 1.式子:考虑dp[ i ][ j ]能从dp[ i-1 ][ k ](max(0 , j - c[ i ] ...
- quartz框架实现定时任务举例
简单的定时任务功能可以通过原生的java.util.Timer定义执行时间规则.继承java.util.TimeTask来定义执行逻辑来实现,更方便的是利用开源的quartz框架,只需定义几个spri ...
- Oracle事务的隔离
事务是指一些列操作的集合,它有4个属性:原子性(Automacity).一致性(Consistency).隔离性(Isolation)和持久性(Durability),这4个属性简称为ACID.原子性 ...
- laravel 中间件学习
http://blog.csdn.net/kwinh/article/details/56285204 http://blog.csdn.net/fationyyk/article/details/5 ...