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
原创粉丝点击