1.内存的访问权限检查
内存的访问权限检查是MMU的主要功能之一,简单地说,它就是决定一块内存是否允许读、是否允许写。这由CP15寄存器C3(域访问控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位等联合作用。
CP15寄存器C1中的A位表示是否对地址进行对齐检查,所谓对齐检查就是访问字时地址是否为4字节对齐,访问半字时地址是否2字节对齐,如果地址不对齐则产生"Alignment fault"异常。无论MMU是否被开启,都可以进行对齐检查。CPU读取指令时不进行对齐检查,以字节为单位访问时也不进行对齐检查。对齐检查在MMU的权限检查和地址映射前进行。
内存的访问权限检查可以概括为以下两点:
(1)"域"决定是否对某块内存进行权限检查。
(2)"AP"决定如何对某块内存进行权限检查。
2440中有16个域,CP15寄存器C3中每两位对应一个域,用来表示这个域是否进行权限检查,具体如表1所示。
表1 域访问控制寄存器中每两位数据的含义
值 |
含义 |
说明 |
00 |
无访问权限 |
任何访问都将导致“Domain Fault”错误 |
01 |
客户模式 |
使用段描述符、页描述符进行权限检查 |
10 |
保留 |
保留,相当于“无访问权限” |
11 |
管理模式 |
不进行权限检查,允许任何访问 |
段描述符中的"Domain"占据4个bit,用来表示这块内存属于上面定义的16个域中的哪个。举例:
段描述符中的"Domain"为0b0000时,表示这1M内存属于域0,如果域访问控制寄存器(C3)的位[1:0](C3一共对应16个域,位[1:0]对应第0个域)等于0b00,则访问这1MB空间时都会产生"Domain fault"的异常,如果域访问控制寄存器的位[1:0]等于0b11,则使用描述符中的"AP"位进行权限检查。
二级页表描述符中的"ap0~ap3"与段描述符中的"AP"结合CP15寄存器C1的R/S位,决定如何进行访问权限检查。首先说明,段描述符中的"AP"控制整个段(1MB)的访问权限:大页描述符中的每个"apx"控制一个大页(64KB)中1/4内存的访问权限,即"ap3"对应大页高端的16KB,"ap0"对应大页低端的16KB;小页描述符与大页描述符相似,每个"apx"控制一个小页(4KB)的1/4内存的访问权限;极小页中的"ap"就控制着整个极小页的访问权限。AP位、S位和R位的组合,可以产生多种访问权限,具体如表2所示。
表2 AP位、S和R位的访问权限对照表
AP |
S |
R |
特权模式 |
用户模式 |
说明 |
00 |
0 |
0 |
无访问权限 |
无访问权限 |
任何访问都产生“Permission fault” |
00 |
1 |
0 |
只读 |
无访问权限 |
在超级权限下可以进行读操作 |
00 |
0 |
1 |
只读 |
只读 |
写操作产生“Permission fault” |
00 |
1 |
1 |
保留 |
- |
- |
01 |
X |
X |
读/写 |
无访问权限 |
只允许在超级模式下访问 |
10 |
X |
X |
读/写 |
只读 |
在用户模式下进行写操作将产生“Permission fault”异常 |
11 |
X |
X |
读/写 |
读/写 |
在所有模式下允许任何访问 |
XX |
1 |
1 |
保留 |
- |
- |
2.TLB的作用
从虚拟地址到物理地址的转换过程可知:使用一级页表进行地址转换时,每次读/写数据需要访问两次内存,第一次访问一级页表获得物理地址,第二次才是真正的读写数据;使用两级页表时需要3次访存。
利用程序执行时的局部性特性,通过使用一个高速、容量相对较小的存储器来存储近期用到的页表条目,这样可以大幅提高系统性能,这个存储器用来帮助快速地进行地址转换,称为"转译查找缓存"(TLB)。
使用TLB需要保证TLB中的内容与页表一致,在启动MMU之前、在页表中的内容发生变化后,尤其要注意。