S5pv210uboot启动第一阶段分析之地址重定位和跳转。
来源:互联网 发布:不基于比较的排序算法 编辑:程序博客网 时间:2024/05/16 17:17
这是uboot启动的第一阶段,我们可以发现,我们来分析一下uboot的第一阶段地址问题:我们知道在编译的时候我们进行了地址的重定位,但是下载的时候我们显然是下载到了flash里面,在开机的时候由控制器加载到了内部Iram中(但是内部的iram仅仅是4K)这4K主要的作用很简单初始化一些设备,同时完成代码的拷贝将代码拷贝到我们链接地址指定的地方。我们的代码在一开始执行的时候我们使用了地址无关的代码(汇编中的地址无关码)所以一开始在Iram中可以正常执行,但是剩下的代码就需要我们拷贝到外部的dram执行了,当然是从flash中拷贝,而且要注意,拷贝是完全拷贝,不可能是拷贝剩下的(所谓剩下,就是在内部iram中已经执行了的)那问题也就接种而来:拷贝完是如何跳转那?首先应该明确的是ARM是统一编址的,这点使他的跳转不必使用什么特殊的指令,就是正常的跳转就ok,我们所谓的跳转也就是在执行完iram中的代码跳转到
DRAM中执行跳转前的下一条指令。如何实现那?
我们可以看一下代码:
这个代码写的有意思:我们分析一下:要给pc赋值实现跳转,我们首先要明白,我们跳转后的地址应该是我们下条指令的地址(但注意着是汇编,顺序执行是小概事件,人家就喜欢乱跳),也就是—start—armboot的值,也就是450行的地址。我们看下反汇编:其实有时候反汇编要比你看源代码更爽,因为看源代码你还要分析宏定义的这些代码执行了没有,但是反汇编就可以知道哪些代码执行了
注意pc的地址和pc-4的地址我用箭头标出,ldr是条伪指令最后替换为pc-40(三级流水的原因),也可以看出这是一条绝对跳转,注意看上面的源码,ldr这条指令是取地址中的值,我想你应该明白了吧!那地址是0xc3e00210,里面的值是4个字节的 c3e026b4。所以这一跳可跳远了,跳到了c3e02b64其实就到了外部的dram中了!其实这个我记得在pc中linux启动的时候也是这么写的,分析完觉得也没什么,可见我们对汇编代码还是不敏感。当然跳转分析完了,你可能说,重定位那?这就叫重定位,其实我最先看到重定位这个词是在一本操作系统的书里面讲连接器的时候提到,这里叫地址跳转更好,但是很多人说这的重定位,那就重定位吧,更准确的说法应该是在这里重定位开始起作用了!
就分析到这 2017年1月10日18:33:55 张飞online
0 0
- S5pv210uboot启动第一阶段分析之地址重定位和跳转。
- 地址重定位:静态重定位和动态重定位
- 地址重定位:静态重定位和动态重定位
- 地址重定位:静态重定位和动态重定位
- 地址重定位:静态重定位和动态重定位
- uboot启动第一阶段分析
- 操作系统_第四章_存储管理之重定位:绝对地址和相对地址
- u-boot-2012.04.1 第一阶段分析 内存划分 代码重定位
- 程序地址重定位和模块绑定
- 程序地址重定位和模块绑定
- 【转】地址重定位:静态重定位和动态重定位
- 【转】地址重定位:静态重定位和动态重定位
- 【转】地址重定位:静态重定位和动态重定位
- U-Boot 启动过程和源码分析(第一阶段)
- 重定位启动代码和向量表
- linux内核启动第一阶段分析
- uboot启动第一阶段详细分析
- uboot - 启动流程分析【第一阶段】
- 1.1数据结构->线性表->顺序表
- eclipse下debug模式不能正常运作的解决方法
- jquery对象以及方法总结
- RxJava的几个操作符和应用场景
- 邮箱发邮件代码示例
- S5pv210uboot启动第一阶段分析之地址重定位和跳转。
- 在Struts2 的Action中怎样获取表单提交上来的多个checkbox的值
- dataGridView修改完数据后,滚动条位置不变,强制选择当前行
- SQL一
- 七,redis集群
- Spring定时任务不执行的解决
- Json键值对
- 用ajax技术实现 无刷新实现用户登录
- Leetcode-96.Unique Binary Search Trees