电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

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

来源:华强电子网 作者:华仔 浏览:130

标签:

摘要: 在考虑为什么要重定位的问题之前,我们首先要明白一下几点: 1. 链接地址的定义:我自己理解是,程序被定义的开始执行的内存地址。 2. 当ARM从nandflash启动的时候,CPU所做的工作是将nandflash中的前8K代码自动的到6410的0地址(即Stepping Stone)中去,然后从0地址开始执行程序。 3. 程序在执行过程中,用链接地址来访问全局变量。全局变量一般被存放于程序的

在考虑为什么要重定位的问题之前,我们首先要明白一下几点:

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 :
200: 00000000 ......

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

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67