ARM中的链接地址(为什么ARM要重定位)?

来源:互联网 发布:netstat查看指定端口 编辑:程序博客网 时间:2024/05/22 16:44
 
    
    在考虑为什么要重定位的问题之前,我们首先要明白一下几点:
    
    1. 链接地址的定义:我自己理解是,程序被定义的开始执行的内存地址。
    
    2. 当ARM从nandflash启动的时候,CPU所做的工作是将nandflash中的前8K代码自动的复制到6410的0地址(即Stepping Stone)中去,然后从0地址开始执行程序。
    
    3. 程序在执行过程中,用链接地址来访问全局变量。全局变量一般被存放于程序的最后面。
    
    在程序超过8K时,如果不进行重定位,就会发生类似于下面的访问错误,这将导致程序无法正常执行。
    
    假设我们定义程序的链接地址为0x50000000,程序从6410的0地址(即Stepping Stone)执行的时候,如果要访问某个全局变量时,假设其反汇编代码如下:
    500000a4    e59f303c    ldr r0, [pc, #60]      ;r0 = [0x500000e8] =0x00000200
    500000a8    e5933000    ldr r0, [r0]                ;r0 = [0x00000200]
    500000ac ......
    ......
    500000e8 00000200 .......
    
    00000200 <i>:
    200:            00000000    ......    
    

    我们可以看出来,r0的值要根据地址0x500000e8处获得,而在Stepping Stone中无法找到0x500000e8这个地址,这样程序就会出错。所以在程序被CPU拷贝到Stepping Stone后,我们要先写一段程序初始化nandflash和内存,再利用位置无关的代码将程序从nandflash拷贝到内存中,然后跳转到其它函数继续执行,这就是ARM的重定位。

*****************************************************************************************************************************************************************************************

以上纯属个人观点,有错误的地方还请大侠们指正!谢谢!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗身上会有蛆虫怎么办 狗身上长满了蛆怎么办 房间墙上有很多小虫子怎么办 床上有许多小虫子怎么办? 店里有许多小虫子怎么办 房间潮湿有很多小虫子怎么办 家里潮湿墙上发霉长小虫怎么办? 房间有小飞虫子怎么办 狗被灭虫剂喷了怎么办 吃鸡玩久了手机屏幕很涩怎么办 超东卧室太阳晒怎么办 床头上的布破了怎么办 老年机全静音了怎么办 老年机手机不亮怎么办 70岁老人耳朵聋怎么办 血压太低了头晕怎么办 血压高忽然变低怎么办 血压高眼睛红了怎么办 高血压200降不下去.怎么办 高血压吃药降不下来怎么办 合肥房子卖了户口怎么办 吃了粽子胃难受怎么办 突然血压高怎么办需要吃药吗? 胃一阵阵疼然后拉肚子怎么办 橱子和墙壁不平怎么办 复印选项是英文不认识怎么办 防盗门锁与门框结合不好怎么办 仿瓷涂料墙壁脏了怎么办 油笔画到墙纸上怎么办 水笔画在墙纸上怎么办 屋里有股石灰味怎么办 厨房太阳对着晒怎么办 房子有太阳西斜怎么办 房子晒到太阳很热怎么办 房子被太阳热了怎么办 房间西晒窗帘不遮光怎么办 新建房屋一面墙体有裂缝怎么办 卫生间地砖缝隙出现渗水怎么办 西户窗户太晒怎么办 西晒的墙面很烫怎么办 儿童房颜色太粉了怎么办?