罗伯特侯
这是我12年前的条记,共享给须要的人。

映射便是逐一对应的意思。重映射便是重新分配这种逐一对应的关系。

我们可以把存储器算作一个具有输出和输入口的黑盒子。如下图所示,输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很繁芜的半导体电路具现的,详细的实现的办法我们现在不管。存储单位一样平常是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会涌如今数据总线上面。
图1
普通的单片机把可实行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。个中存储器中每个物理存储单元与其地址是逐一对应而且是不可变的。如图1,CPU读取0x00000000地址上存储单元的过程。
图2
ARM比较繁芜。ARM芯片与普通单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址可以根据设置变换。便是说一个物理存储单元现在对应一个地址,经由设置往后,这个存储单元就对应了其余一个地址了。图3是随意举了个例子(不要与ARM芯片对应),旨在解释地址重映射的过程。图3表示把0x00000000地址上的存储单元映射到新的地址0x00000007上。CPU存取0x00000007便是存取0x00000000上的物理存储单元。
图3
图4,图5针是对ARM芯片(NXP LPC系列)的两种地址重映射办法的图示。图3 假设我们的运用程序存放在外扩FLASH当中,那么运用程序的非常向量表就存放在0x80000000起始的64个(个中有32个存放非常向量)物理存储单元中。但是ARM核发生非常(中断)后是从0x00000000~0x0000003F地址范围取非常向量的。以是要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。往后CPU存取0x00000000~0x0000003F地址便是存取0x80000000~0x8000003F范围内的存储单元。图4只显示出第一个非常向量的地址重映射,全体非常向量表的地址重映射等同这个过程。
图4
图5图示了ARM芯片的其余一种映射办法。这个映射可以由用户决定采取还是不采取(干系代码在工程文件的startup.s中,这个文件是第三方供应,用户可以修正)。这个映射紧张是为了提高运用程序非常相应得速率。当我们把运用程序存放在片内FLASH的时候,非常向量表存放在0x00000000~0x0000003F存储单元内。每次发生非常,CPU从0x00000000~0x0000003F地址上取非常向量。但是对RAM的存取速率远高于对FLASH的
图5
存取速率,所以为了提高非常相应速率我们采纳以下做法:
(1)先把0x00000000~0x0000003F(FLASH)存储单元内的非常向量表复制到0x40000000~0x4000003F(片内RAM的最低端64个字节的存储单元)范围内存储单元中。
(2) 把0x40000000~0x4000003F范围内存储单元地址重新映射到0x00000000~0x0000003F地址范围。
这样做了往后,当非常发生的时候,CPU取非常向量便是从RAM区中的非常向量表中区,速率快了。比如复位中断发生,CPU从地址0x00000000取指令,但此时由于已经由地址重新映射,这个0x00000000被地址转换器转换成0x40000000,CPU实际上是取的RAM区中0x400000000这个存储单元内的指令(非常向量)。
当然用户可以不进行这种映射。片内FLASH中0x00000000~0x0000003F存储单元具有千篇一律的非常向量表。只不过不进行这种处理,非常相应速率慢一点。但是这种速率上的差别很多情形下是不必要在意的。
图中的地址转换器受掌握寄存器MENMAP的掌握,用户可以设置MENMAP实现对地址重映射的掌握。这个地址转换器显然是通过内部硬件电路实现的。






