Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82222
  • 博文数量: 19
  • 博客积分: 325
  • 博客等级: 一等列兵
  • 技术积分: 197
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-29 11:51
文章分类

全部博文(19)

文章存档

2013年(1)

2012年(18)

我的朋友

分类:

2012-11-20 19:26:19

原文地址:MMU简介[转帖] 作者:enjoying-spring

MMU简介

嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如FLASHSRAMSDRAMROM等,这些不同类型的存储器件速度和宽度等各不相同;在访问存储单元时,可能采取平板式的地址映射机制对其操作,或需要使用虚拟地址对其进行读写;系统中,需引入存储保护机制,增强系统的安全性。为适应如此复杂的存储体系要求,ARM处理器中引入了存储管理单元来管理存储系统。

ARM存储系统中,使用MMU实现虚拟地址到实际物理地址的映射。为何要实现这种映射?首先就要从一个嵌入式系统的基本构成和运行方式着手。系统上电时,处理器的程序指针从0x0(或者是由0Xffff_0000处高端启动)处启动,顺序执行程序,在程序指针(PC)启动地址,属于非易失性存储器空间范围,如ROMFLASH等。然而与上百兆的嵌入式处理器相比,FLASHROM等存储器响应速度慢,已成为提高系统性能的一个瓶颈。而SDRAM具有很高的响应速度,为何不使用SDRAM来执行程序呢?为了提高系统整体速度,可以这样设想,利用FLASHROM对系统进行配置,把真正的应用程序下载到SDRAM中运行,这样就可以提高系统的性能。然而这种想法又遇到了另外一个问题,当ARM处理器响应异常事件时,程序指针将要跳转到一个确定的位置,假设发生了IRQ中断,PC将指向0x18如果为高端启动,则相应指向0vxffff_0018处),而此时0x18处仍为非易失性存储器所占据的位置,则程序的执行还是有一部分要在FLASH或者ROM中来执行的。那么我们可不可以使程序完全都在SDRAM中运行呢?答案是肯定的,这就引入了MMU,利用MMU,可把SDRAM的地址完全映射到0x0起始的一片连续地址空间,而把原来占据这片空间的FLASH或者ROM映射到其它不相冲突的存储空间位置。例如,FLASH的地址从0x0000_00000x00ff_ffff,而SDRAM的地址范围是0x3000_00000x31ff_ffff,则可把SDRAM地址映射为0x0000_00000x1fff_ffffFLASH的地址可以映射到0x9000_00000x90ff_ffff(此处地址空间为空闲,未被占用)。映射完成后,如果处理器发生异常,假设依然为IRQ中断,PC指针指向0x18处的地址,而这个时候PC实际上是从位于物理地址的0x3000_0018处读取指令。通过MMU的映射,则可实现程序完全运行在SDRAM之中。

在实际的应用中,可能会把两片不连续的物理地址空间分配给SDRAM。而在操作系统中,习惯于把SDRAM的空间连续起来,方便内存管理,且应用程序申请大块的内存时,操作系统内核也可方便地分配。通过MMU可实现不连续的物理地址空间映射为连续的虚拟地址空间。

操作系统内核或者一些比较关键的代码,一般是不希望被用户应用程序所访问的。通过MMU可以控制地址空间的访问权限,从而保护这些代码不被破坏。MMU的实现过程,实际上就是一个查表映射的过程。建立页表(translate table)是实现MMU功能不可缺少的一步。页表是位于系统的内存中,页表的每一项对应于一个虚拟地址到物理地址的映射。每一项的长度即是一个字的长度(在ARM中,一个字的长度被定义为4字节)。页表项除完成虚拟地址到物理地址的映射功能之外,还定义了访问权限和缓冲特性等。

MMU的映射分为两种,一级页表的变换和二级页表变换。两者的不同之处就是所实现的变换地址空间大小不同。一级页表变换支持1M大小的存储空间的映射,而二级可以支持64KB4KB1KB大小地址空间的映射。

要实现从虚拟地址到物理地址的映射,必然会遇到一个问题,如何找到这个页表。对于表的查找,要知道这个表的基地址和偏移地址,在具有MMU功能的处理器中,集成了一个被称为CP15的协处理器,该协处理器的C2寄存器中用于保存页表的基地址,下面以一级页表变换为例说明MMU实现地址变换的过程。

当处理器访问一个虚拟地址时,该虚拟地址的[3120]作为偏移地址与页基地址结合(基地址必须是64KB对齐的,因此基地址的[130]位都为0),得到一个32位的页表项地址(因为页表项为4字节对齐,[10]两位为0)。通过这个页表项地址可以检索到该页表项。

查找到页表项后,根据页表项的访问特性(缓冲以及是否允许访问等)协处理器决定是否允许访问。如不允许访问,则协处理器向CPU报告出错信息;反之,由页表项的[3120]位与虚拟地址的[190]一起组成实际的物理地址,实现从虚拟地址到物理地址的映射。

对于实际编程工作而言,主要是确定如何编写页表中的内容并如何确定页表项地址。现举例如下:

假设物理地址为0x36B0_00000x36Bf_ffff1M空间)的一块连续空间需映射为0x0100_00000x010f_ffff的一块连续空间:

1.确定页表项中的内容:把物理地址的基地址作为页表项的高12位(31bit21bit),填写访问属性。假设可以读写,可以读缓存、写缓冲,这样该页表项内容为0x36B0_0C00E

2.确定页表基地址,填写页表基地址到CP15寄存器的C2中。页表的基地址要为64KB对齐;

3.计算出偏移地址,把内容填写到页表项地址中。页表项地址=页表基地址+(物理地址基地址>>18),如页表基地址为0xA100_0000,那么,页表项地址=0xA100_0DAC

4.将页表项数值写到对应的页表项地址中。上例中,需要向地址0xA100_0DAC中写入0x36B0_0C00E

MMU 是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU通常是CPU的一部分,本身有少量的存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU决定数据只在RAM中还是在大容量的存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断

MMU的两个主要功能是:

²  将虚拟地址转换为物理地址

²  控制存储器存取允许。MMU关掉时,虚地址直接输出到物理地址总线。

在实践中,使用MMU解决了以下几个问题:

²  使用DRAM作为大容量存储器时,如果DRAM行列是非平方的,会导致该DRAM的物理地址不连续,这将给程序的编写调试造成极大的不方便,而适当的配置MMU可将其转换成虚拟地址连续的空间;

²  ARM内核的中断向量表放在0地址,对于ROM0地址的情况,无法调用中断服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址;

²  系统的某些地址是不允许被访问的,否则会产生不可预料的后果,为避免这类错误,可以通过MMU匹配表的设置将这些地址设为用户不可以存取类型;

启动程序中生成的匹配表中包含地址映射,存储页面大小(1M64K 或者4K)以及是否允许存取等信息。
阅读(644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~