现在的位置: 首页 > 综合 > 正文

arm9处理器的虚拟内存管理单元(MMU)

2013年09月15日 ⁄ 综合 ⁄ 共 2308字 ⁄ 字号 评论关闭

Linux与ulinux的主要区别其中一点就是有没有mmu。所以我想在这里记录一下我对它的理解。文章分2个部分来记录,第一部分就是讲述当虚拟地址传递给cpu后,cpu是如何解析它,把它装换成物理地址,再把这个地址送到内存总线上;第二部分就是要讨论MMU是如何控制存储空间的访问权限的。

这里我先述说第一部分:

我先在这里述说一下一些基本概念,页表,页表项。表是用来干什么的?其实就是反应虚拟地址和物理地址的映射关系。具体来说就是当一个虚拟地址穿给cpu后,cpu就会根据这个地址找到对应页表,再找到页表项。然后只要访问页表项的内容,你就知道这个虚拟地址是对应哪个物理地址了。ARM可以通过一级表就可以完成目的,但是也可以通过二级表来完成任务。linux是选择后者来实现的,所以我只是讨论后者的情况。页表项就是页表里面的每一项咯。

虚拟存储空间到物理存储空间的映射是以块为单位的,ARM支持的存储块的大小有以下几种:

1.段,大小为1MB

2.大页,大小为64KB

3.小页,大小为4KB

4.极小页,大小为1KB

对于一级页表来说,它的基址是存放在cp15的c2寄存器里面的。一级页表的页表项的结构是这样的:

31位~10位细粒度二级页表基址;(其实这只是其中的一种变换方法,一共有6种变换方法,我这里只说linux里面常用的粗粒度小页地址变换方法。这里说的小页就是我们上面刚说的存储块的大小中的一种。)

1位~0位:这两位数可以有4种组合,对于这种方法,我们用的是01。

对于中间的几位与访问权限和cache有关。这里以免弄混,用到时我们再来讨论。

好了现在了解了一级页表项里面的结构了。

我们现在来说说二级页表,和它的页表项结构。但是在说这个之前,我先要说说一个规则。当以二级分页管理某段存储空间时,要同时设置一级页表项和二级页表项,一个一级页表项对应1段(1MB)虚拟存储空间的映射关系,一个一级页表项对应一张二级页表,这张二级页表中的所有页表项对应的虚拟空间映射关系的总和,就是一级页表的页表项虚拟存储空间的映射了。举个例子,假设物理存储空间一页的大小设置为4kb,0~4kb这个地址空间就有一页的大小了。刚才不是说了,一级页表的一个页表项对应1段大小的虚拟存储空间的映射。再加上两个两个限制:二级页表的大小为1KB;每个页表项占4个字节(4byte)。这样就可以知道二级页表一共有256项,也就是有256个页表项。现在如果一个页表项映射0~4kb的物理存储空间。那么256个页表项就一共映射了0~1024kb的物理存储空间了。很明显这个空间的

大小为1M。就是一级页表一个页表项对应的虚拟存储空间映射关系的范围。

好了,说了那么多,大家应该明白了吧,如果还是不明白就画画图吧。

其实刚才打的例子就是粗粒度小页地址变换方法的具体规则,我再叙述一遍:一级页表的每个页表项对应的虚拟存储空间映射关系的范围是1MB,其页表项结构告诉我们31位~10位是粗粒度二级页表的基址;二级页表的大小为1KB;每个页表项占4个字节,它对应的虚拟存储空间映射关系的范围是4kb。

接下来,我们来看看二级页表的页表项的结构:

31位~12位存放着小页基地址。

这样就把整个页表结构说了一遍了。好了,现在我们来讨论虚拟地址是如何转换成物理地址的。

传给cpu的虚拟地址的结构如下:

31位~20位存放着一级页表内偏移序号;

19位~16位存放着二级页表内偏移序号;

15位~0位存放着页内偏移序号;

首先会提取31位~20位的一级页表内偏移序号,再去访问CP15的C2寄存器,把一级页表的页表基址提取出来。页表基址加上页表偏移序号就可以找到一级页表里面相应的页表项。访问这项可以得到二级页表的基址。

然后会再提取19位~16位的二级页表内偏移序号,加上刚才获得的二级页表的基址。这样就可以得到二级页表的页表项了。访问其内容,可以得到物理地址的基址。

最后提取15位到0位的页内偏移序号,加上刚才的物理地址基址。就可以得到物理地址了。

这就是整个转换过程了。

接下来,我要讨论的是MMU的访问控制基址(就是内存保护机制)

先要说说这个方面涉及到几个元素:

CP15的C3、C5、C6、还有C1的S和R位。还有就是各级页表的页表项结构中的某些位,这些位构成了AP和DOMAIN。(以后我们把页表项的结构称为描述符)

我们先来说说C3吧,这个寄存器记录了D0~D15这十六个域,每个域用2位来表示。什么是域?MMU把整个存储空间划分成16个域,每个域都有对应的存储区域的。那么用这两位来表示什么呢?是权限,是访问这个域的权限。这2位有4种组合,每个的具体意义如下:

00:没有访问权限

01:客户(client)根据CP15的C1中的R和S位,再加上各级页表的描述符里面的AP来确定是否允许各系统工作模式的存储访问。

10:保留

11:管理者,可以在任何工作模式都可以访问。

接下来我们来具体分析一下在粗粒度小页地址装换方法的情况下是如何来控制访问权限的。

对于一级页表的页表项描述符里,8位~5位存放着DOMAIN,我们根据它就可以知道这个段是属于哪个域的。

对于二级页表的页表项描述符里,11位~4位存放着AP3~AP0的信息,每个各占两位。

我们可以根据C3来判断那个域的权限。大家肯定会问到,AP3~AP0还有刚才提到的C1的S和R位他们好像没有起到作用。关键就在这里,如果这个域的权限是client的话,就要对应一张表来确定在特权模式下的访问权限是怎样,还有在用户模式下的访问权限是怎么样的。关于这张表在网上很容易找到(Interpreting Access Permission(AP)Bits)。

 

 

 

 

 

抱歉!评论已关闭.