打印
[ARM程序分析与设计]

转载:ARM地址重映射的通俗解释

[复制链接]
13737|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
galaxy9229|  楼主 | 2008-8-13 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM芯片的地址重映射 映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系。 我们可以把存储器看成一个具有输出和输入口的黑盒子。如下图所示,输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。
 
图1 
普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。如下图,CPU读取0x00000000地址上存储单元的过程。
 
                   图2 
ARM比较复杂。ARM芯片与普通单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了。图3是随意举了个例子(不要与ARM芯片对应),旨在说明地址重映射的过程。图3表示把0x00000000地址上的存储单元映射到新的地址0x00000007上。CPU存取0x00000007就是存取0x00000000上的物理存储单元。
 
                  图3 
下面图4,图5是对ARM芯片的两种地址重映射方式的图示。 假设我们的应用程序存放在外扩FLASH当中,那么应用程序的异常向量表就存放在0x80000000起始的64个(其中有32个存放异常向量)物理存储单元中。但是ARM核发生异常(中断)后是从0x00000000~0x0000003F地址范围取异常向量的。所以要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。以后CPU存取0x00000000~0x0000003F地址就是存取0x80000000~0x8000003F范围内的存储单元。图4只显示出第一个异常向量的地址重映射,整个异常向量表的地址重映射等同这个过程。 
 
图4 

图5 
图5描述示了ARM芯片的另外一种映射方式。这个映射可以由用户决定采用还是不采用(相关代码在工程文件的startup.s中,这个文件是第三方提供,用户可以修改)。这个映射主要是为了提高应用程序异常相应得速度。当我们把应用程序存放在片内FLASH的时候,异常向量表存放在0x00000000~0x0000003F存储单元内。每次发生异常,CPU从0x00000000~0x0000003F地址上取异常向量。但是对RAM的存取速度远高于对FLASH的存取速度,所以为了提高异常相应速度我们采取以下做法:
 Step 1:
  先把0x00000000~0x0000003F(FLASH)存储单元内的异常向量表复制 到0x40000000~0x4000003F(片内RAM的最低端64个字节的存储单元)范围内存储单元中。 
 Step 2:
   把0x40000000~0x4000003F范围内存储单元地址重新映射到0x00000000~0x0000003F地址范围。 这样做了以后,当异常发生的时候,CPU取异常向量就是从RAM区中的异常向量表中区,速度快了。比如复位中断发生,CPU从地址0x00000000取指令,但此时由于已经过地址重新映射,这个0x00000000被地址转换器转换成0x40000000,CPU实际上是取的RAM区中0x400000000这个存储单元内的指令(异常向量)。 当然用户可以不进行这种映射。片内FLASH中0x00000000~0x0000003F存储单元具有一模一样的异常向量表。只不过不进行这种处理,异常相应速度慢一点。但是这种速度上的差别很多情况下是不必要在意的。
     图中的地址转换器受控制寄存器MENMAP的控制,用户可以设置MENMAP实现对地址重映射的控制。这个地址转换器显然是通过内部硬件电路实现的。 

相关帖子

沙发
yewuyi| | 2008-8-14 11:50 | 只看该作者

对于第一种中断向量的重映射

如果像普通MCU那样不需要外括FLASH,这样是否就不需要重映射中断向量地址了?

CM3那样的是否就不用考虑重映射了?

使用特权

评论回复
板凳
galaxy9229|  楼主 | 2008-8-14 13:51 | 只看该作者

重映射是可选项,不是必须的,根据你的需求和设计来决定

使用特权

评论回复
地板
真白菜| | 2008-8-21 19:00 | 只看该作者

顶该加裤子!!!!!!!!!!!!!1

使用特权

评论回复
5
tanchao| | 2008-8-22 10:25 | 只看该作者

建议加精

如题

使用特权

评论回复
6
Wxy8030| | 2008-9-2 15:10 | 只看该作者

LPC213X系列说把异常入口向量复制到RAM中运行的快

就是从FLASH中跳到RAM中,然后从RAM中再跳到FLASH中,比直接在FLASH中跳能快多少?

还有就是把一段程序复制到RAM中,运行速度快......这样做安全吗?

还有就是中断向量都是保存在RAM中的......安全么?

总觉得ARM适合消费电子,不太适合工业控制!

使用特权

评论回复
7
原野之狼| | 2008-9-8 09:53 | 只看该作者

PC的程序就运行在RAM里

使用特权

评论回复
8
Wxy8030| | 2008-9-9 08:36 | 只看该作者

所以PC老死机!

使用特权

评论回复
9
xwj| | 2008-9-9 08:39 | 只看该作者

“死机”和“运行在RAM里”没多大关系

使用特权

评论回复
10
dld2| | 2008-9-9 08:51 | 只看该作者

映射不是“一一对应”

重映射之后,一般原来的地址依然有效。
也就是说,可能两个地址,对应一个存储单元。

另外也不同意6楼的说法。

使用特权

评论回复
11
galaxy9229|  楼主 | 2008-9-10 17:55 | 只看该作者

“一一对应”应该理解为可配置的“一一对应”,而不是固

“一一对应”应该理解为可配置的“一一对应”,而不是固定不变的

使用特权

评论回复
12
avr32| | 2008-9-17 10:02 | 只看该作者

高中数学老师说过

函数是一种特殊的影射

使用特权

评论回复
13
weibn| | 2008-11-2 22:10 | 只看该作者

ARM地址重映射的通俗解释

醍醐灌顶,谢谢~

使用特权

评论回复
14
noend297| | 2008-12-15 21:31 | 只看该作者

重映射是重复映射

我感觉有篇**解释的更容易理解:重映射是重复映射,就是一个单元分配了两个地址。例如boot重映射了,但在原来的地址还是能读出来

使用特权

评论回复
15
lelee007| | 2009-8-2 22:47 | 只看该作者
哈哈,讨论的挺有意思

重复映射让俺长见识

使用特权

评论回复
16
mmd2102| | 2009-8-5 20:34 | 只看该作者
好帖子又出来.拜读中.作者写的很好,转帖的人也有功劳.

使用特权

评论回复
17
雪域流星| | 2009-8-9 22:09 | 只看该作者
正在学习 谢了

使用特权

评论回复
18
一只小蜗牛| | 2009-8-19 10:38 | 只看该作者
学习中

使用特权

评论回复
19
ttlasong| | 2009-8-22 01:49 | 只看该作者
顶一顶

使用特权

评论回复
20
华荣汇FAE4| | 2009-8-24 17:48 | 只看该作者
顶一顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

69

帖子

0

粉丝