存储器映射和存储器重映射概念
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
存储器映射和存储器重映射
1.1 什么是存储器映射?
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配的,给存储器分配地址的过程就称为存储器映射。如图 1.所示。
图 1.1 映射原理图
在完成了存储器映射后,用户就可以按地址去访问对应的存储单元。
1.2 什么是存储器重新映射?
顾名思义,存储器重映射就是给存储单元再分配1个地址。此时,该存储单元就有了两个地址。用户可以通过这两个地址来访问该存储单元。如图 1.1所示。
图 1.1 存储器重映射
1.3 为什么要进行存储器重映射?
在实际应用中,我们需要对某些存储单元再分配地址;此时,就要进行存储器重映射。例如,异常向量表所在存储单元和Boot ROM都须进行重映射。下面以异常向量表所在存储单元的重映射为例说明如下:
(1)用户程序总是从异常向量表开始执行
在ARM7编程中,异常向量表是用户程序的必备部分,程序流总是从异常向量表开始的。
(2)发生异常时,只能通过规定地址访问异常向量表
由ARM7体系结构可知,ARM7的异常向量地址始终是0x0000 0000~0x0000 001c 。例如,复位时,CPU 会自动跳转到复位异常向量地址0x0处读取该处指令。
(3) 异常向量表所在的存储单元地址不固定
用户程序可以存储在片内RAM 、片内Flash 、片外存储器,随着存储位置的不同,用户程序的存储地址显然也不同;因此,作为用户程序一部分的异常向量表的存储地址也是不固定的。如图 1.2所示。
0x0000 00000x0000 001C
0x4000 0000
0x4000 001C 0x8000 00000xE000 0000
0xFFF FFFF 0x8000 001C 不定
图 1.2 各异常向量表的实际位置
(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个地址,以解决一些实际需要。
应用存储器重映射机制的例子,除异常向量表以外还有Boot ROM 。若您有兴趣,可参考我们的《深入浅出ARM7――LPC2300(上册)》中的“存储器重映射及引导块”小节。