映射便是一一对应的意思。重映射便是从头分配这种一一对应的联系。
咱们能够把存储器当作一个具有输出和输进口的黑盒子。如下图所示,输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很杂乱的半导体电路具 现的,详细的完成的方法咱们现在不论。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应 的存储单元上存储的数据就会出现在数据总线上面。
一般的单片机把可执行代码和数据寄存到存储器中。单片机中的CPU从储器中取指令代码和数据。其间存储器中每个物理存储单元与其地址是一一对应并且是不可变的。如图1,CPU读取0x00000000地址上存储单元的进程。
图2
ARM比较杂乱。ARM芯片与一般单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址能够依据设置改换。便是说一个物理存储单元现在对应一个地址,经过设置今后,这个存储单元就对应了别的一个地址了。图3是随意举了个比方(不要与ARM芯片对应),旨在阐明地址重映射的进程。图3表明把0x00000000地址上的存储单元映射到新的地址0x00000007上。CPU存取0x00000007便是存取0x00000000上的物理存储单元。
图3
图4,图5是对ARM芯片的两种地址重映射方法的图示。图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的存取速度,所以为了进步反常相应速度咱们采纳以下做法:
(1)先把0x00000000~0x0000003F(FLASH)存储单元内的反常向量表复制到x40000000~0x4000003F(片内RAM的最低端64个字节的存储单元)规模内存储单元中。
(2)把0x40000000~0x4000003F规模内存储单元地址从头映射到0x00000000~0x0000003F地址规模。
这样做了今后,当反常产生的时分,CPU取反常向量便是从RAM区中的反常向量表中区,速度快了。比方复位中止产生,CPU从地址0x00000000取指令,但此刻因为已经过地址从头映射,这个0x00000000被地址转换器转换成0x40000000,CPU实际上是取的RAM区中0x400000000这个存储单元内的指令(反常向量)。
当然用户能够不进行这种映射。片内FLASH中0x00000000~0x0000003F存储单元具有如出一辙的反常向量表。只不过不进行这种处理,反常相应速度慢一点。可是这种速度上的不同许多情况下是不必要介意的。
图中的地址转换器受操控寄存器MENMAP的操控,用户能够设置MENMAP完成对地址重映射的操控。这个地址转换器显然是经过内部硬件电路完成的