1.1 什么是存储器映射?
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配的,给存储器分配地址的过程就称为存储器映射。如图 1.1所示。
图1.1 映射原理图
在完成了存储器映射后,用户就可以按地址去访问对应的存储单元。
1.2 什么是存储器重新映射?
顾名思义,存储器重映射就是给存储单元再分配1 个地址。此时,该存储单元就有了两个地址。用户可以通过这两个地址来访问该存储单元。如图 1.2 所示。
图1.2 存储器重映射
1.3 为什么要进行存储器重映射?
在实际应用中,我们需要对某些存储单元再分配地址;此时,就要进行存储器重映射。
例如,异常向量表所在存储单元和Boot ROM 都须进行重映射。下面以异常向量表所在存储单元的重映射为例说明如下:
(1) 用户程序总是从异常向量表开始执行
在 ARM7 编程中,异常向量表是用户程序的必备部分,程序流总是从异常向量表开始的。
(2) 发生异常时,只能通过规定地址访问异常向量表
由ARM7 体系结构可知,ARM7 的异常向量地址始终是0x0000 0000~0x0000 001c。例如,复位时,CPU 会自动跳转到复位异常向量地址0x0 处读取该处指令。
(3) 异常向量表所在的存储单元地址不固定
用户程序可以存储在片内 RAM、片内Flash、片外存储器,随着存储位置的不同,用户程序的存储地址显然也不同;因此,作为用户程序一部分的异常向量表的存储地址也是不固定的。如图 1.3 所示。
图1.3 各异常向量表的实际位置
(4) 问题的提出
当异常向量表的实际存储地址并不在要求的 0x0000 0000~0x0000 001c 范围时,那么发生异常时,CPU 怎样才能访问到异常向量表呢?
(5) 解决办法--存储器重映射
存储器重映射机制就是为了解决(4)所提的问题而设计的。用户可通过存储器重映射,把地址0x0000 0000~0x0000 001c 再分配给异常向量表所在存储单元。至此,CPU 内核既可以通过0x0000 0000~0x0000 001c 访问异常向量表,也可以通过异常向量表所在存储单元的实际地址来访问异常向量表。例如:用户程序现存放在片外Flash,该程序的异常向量表实际存储地址位于0x80000000~0x8000003C;但通过存储器重映射,可将地址0x00000000~
0x0000003C 分配给0x80000000 ~0x8000003C 的存储单元。于是,用户既可以通过0x80000000~0x8000003C,也可以通过0x00000000~0x0000003C 来访问异常向量表。所以,发生异常时,CPU 虽然仍是访问0x00000000~0x0000003C 处,但仍可通过该地址访问到实际位于片外Flash 的异常向量表。
1.4 小结
由上述可知,存储器重映射的用途就是给存储器单元再分配1 个地址,以解决一些实际需要。