内存管理单元MMU概述

内存管理单元(Memory Management Unit)简称MMU
功能: ①负责虚拟地址到物理地址的映射 ②提供硬件机制的内存访问权限检查。
Q:内存访问权限检查什么意思?
A:举个例子,比如在我们Windows系统的PC中,在一个时间段需要依次运行A,B,C三个应用程序,这三个程序在我们的内存地址中都有其相对应的地址空间。当我们在运行A程序出现错误或者有可能会破坏B程序时,这时由于内存访问权限的存在就使得A程序无法访问B程序所在的内存地址空间,从而避免了由于一个程序的错误而导致损坏其它内存空间的程序,这就是内存访问权限的作用。

这里我们具体看MMU的第一个功能:地址映射。
S3C2440中相关的结构分布如下图:
内存管理单元MMU概述


假设CPU要读/写外部存储器SDRAM中的某一内存地址的数据,这时候有两条路可以选择:
1.④⑤
2.①②③

如果选择第一条路:
CPU发出的地址就可以理解为物理地址,然后经过存储管理器确定SDRAM中相应的行与列最后读取具体的数据。
如果选择第二条路:
CPU发出的地址就可以理解为虚拟地址,经过MMU后出来的就可以认为是物理地址,然后经过存储管理器确定SDRAM中相应的行与列最后读取具体的数据。这里MMU的作用就是把虚拟地址映射为物理地址。

总结:CPU本身不关心地址是物理地址或是虚拟地址,它只管发出这个地址,然后最后读取数据。不关注这个过程具体怎么完成的,平时我们写程序时的链接地址,在CPU这里并不去区分什么物理地址还是虚拟地址,在它看来不管是什么都只是一个地址而已。


虚拟地址(VA,Virtual Address)到物理地址(PA,Physical Address)的转换过程:
这里我们只是简单说一下,不需要太深究,因为这些都是由MMU中硬件完成的,如果想具体的了解可以参考韦东山老师写的《嵌入式Linux应用开发完全手册》。

VA到PA一般有两种方法:1.用一个确定的数学公式进行转换。  2.用表格存储虚拟地址对应的物理地址。这类表格称为页表(Page table),页表由一个个条目(Entry)组成,每个条目存储了一段虚拟地址对应的物理地址及其访问权限,或者是下一级页表的地址。


mips使用的是第一种方法:  VA=f(PA)=0xA0000000+PA,也就是PA=0xA0000000-VA。

我们学的ARM CPU用的是第二种方法,S3C2410/S3C2440最多会用到两级页表:
①如果以段(Section,1MB)的方式进行转换时只用到一级页表;
②以页(Page)的方式进行转换时用到两级页表。这里的页的大小有3种:大页(64KB),小页(4KB),极小页(1KB)。条目也称为“描述符(Descriptor)”,它有:段描述符、大页描述符、小页描述符、极小页描述符,它们保存着段、大页、小页、极小页的起始物理地址;粗页表描述符、细页表描述符,它们保存二级页表的物理地址。

具体转换过程:
1. 根据给定的虚拟地址找到一级页表中的条目。
2. 如果此条目是段描述符,则返回物理地址,转换结束,否则跳到3。
3. 如果此条目是二级页表描述符,继续利用虚拟地址在此二级页表中找到下一个条目。
4. 如果第二个条目是页描述符,则返回物理地址,转换结束。
5. 其它情况出错。

举个例子:我们用段的方式进行转换,由于ARM CPU是32位的,所以最大寻址范围为2^32=4GB,也就是虚拟地址表示的范围为0~4096MB,一个段为1MB,所以我们用的表格就是4096个1MB的段组成的,然后一个段保存着相应的起始物理地址。


这里描述通过一级页表形式的转换过程图:

内存管理单元MMU概述

“TTB Base”代表一级页表的地址。它的值存储在协处理器CP15的寄存器C2(称为页表基址寄存器)。

 内存管理单元MMU概述

一个段描述符为4个字节(32bit),那么4096个段占4096*4B=16KB,所以当虚拟地址寻址范围为0~4G时,一个一级页表的大小就为16KB。

由上可知一级页表的地址必须是16KB对齐的,所以[14:0]都是0。0b100 0000 0000 0000=0x4000=16384=16*1024B=16KB。

 

内存管理单元MMU概述

上图为一级页表的描述符格式,低两位0b10时表示为段描述符。由于这里我们直说关于段描述符的相关概念(也就是上图中第三个格式),所以其它的就不说了,具体了解自己可以看书。

[31:21]: 称为段基址(Section base address)。这个描述符低20位填充0后就是一块1MB物理地址空间的起始地址。0b1 0000 0000 0000 0000 0000=0x10000=1048576=1024*1024B=1MB。

 

综上:以段的方式进行映射时,虚拟地址MVA到物理地址PA的转换过程如下:

内存管理单元MMU概述

1. 虚拟地址MVA。MVA[31:20]表示一级页表索引,MVA[19:0]表示段内地址索引。

2. 页表基地址寄存器。

3. 页表基址寄存器[31:14]和MVA[31:20]组成一个低2位为0的32位地址,MMU利用这个地址找到段描述符。

4. 一级页表中的一个32bit段描述符。

5. 段描述符的位[31:20]和MVA[19:0]构成虚拟地址MVA对应的物理地址PA。