嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如 FLASH , SRAM , SDRAM , ROM 等,这些不同类型的存储器件速度和宽度等各不相同;在访问存储单元时,可能采取平板式的地址映射机制对其操作,或需要使用虚拟地址对其进行读写;系统中,需引入存储保护机制,增强系统的安全性。为适应如此复杂的存储体系要求, ARM 处理器中引入了存储管理单元来管理存储系统。 一 内存管理单元( MMU )概述
在 ARM 存储系统中,使用 MMU 实现虚拟地址到实际物理地址的映射。为何要实现这种映射?首先就要从一个嵌入式系统的基本构成和运行方式着手。系统上电时,处理器的程序指针从 0x0 (或者是由 0Xffff_0000 处高端启动)处启动,顺序执行程序,在程序指针( PC )启动地址,属于非易失性存储器空间范围,如 ROM 、 FLASH 等。然而与上百兆的嵌入式处理器相比, FLASH 、 ROM 等存储器响应速度慢,已成为提高系统性能的一个瓶颈。而 SDRAM 具有很高的响应速度,为何不使用 SDRAM 来执行程序呢?为了提高系统整体速度,可以这样设想,利用 FLASH 、 ROM 对系统进行配置,把真正的应用程序下载到 SDRAM 中运行,这样就可以提高系统的性能。然而这种想法又遇到了另外一个问题,当 ARM 处理器响应异常事件时,程序指针将要跳转到一个确定的位置,假设发生了 IRQ 中断, PC 将指向 0x18( 如果为高端启动,则相应指向 0vxffff_0018 处 ) ,而此时 0x18 处仍为非易失性存储器所占据的位置,则程序的执行还是有一部分要在 FLASH 或者 ROM 中来执行的。那么我们可不可以使程序完全都 SDRAM 中运行那?答案是肯定的,这就引入了 MMU ,利用 MMU ,可把 SDRAM 的地址完全映射到 0x0 起始的一片连续地址空间,而把原来占据这片空间的 FLASH 或者 ROM 映射到其它不相冲突的存储空间位置。例如, FLASH 的地址从 0x0000_0000 - 0x00ff_ffff, 而 SDRAM 的地址范围是 0x3000_0000 - 0x31ff_ffff ,则可把 SDRAM 地址映射为 0x0000_0000 - 0x1fff_ffff 而 FLASH 的地址可以映射到 0x9000_0000 - 0x90ff_ffff (此处地址空间为空闲,未被占用)。映射完成后,如果处理器发生异常,假设依然为 IRQ 中断, PC 指针指向 0x18 处的地址,而这个时候 PC 实际上是从位于物理地址的 0x3000_0018 处读取指令。通过 MMU 的映射,则可实现程序完全运行在 SDRAM 之中。 在实际的应用中,可能会把两片不连续的物理地址空间分配给 SDRAM 。而在操作系统中,习惯于把 SDRAM 的空间连续起来,方便内存管理,且应用程序申请大块的内存时,操作系统内核也可方便地分配。通过 MMU 可实现不连续的物理地址空间映射为连续的虚拟地址空间。 操作系统内核或者一些比较关键的代码,一般是不希望被用户应用程序所访问的。通过 MMU 可以控制地址空间的访问权限,从而保护这些代码不被破坏。
|