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

 
    
    在考虑为什么要重定位的问题之前,我们首先要明白一下几点:
    
    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的重定位。

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值