关于MMU的地址转换和页表的映射网上已经有了很多的文章。确实写得很好,获益匪浅。在这篇文章中只要记录和描述MMU中关于权限访问的控制。
1,MMU对段和页进行保护,在保护过程中区分了权限。它是由域的访问控制字段和一级描述符或二级描述符中的AP字段,以及C1寄存器的S(表示system),R(表示rom)控制位来共同决定的。MMU中的域是指的一些段,大页或者小页的集合。ARM支持最多16个域,每个域的访问控制特性由CP15中的寄存器C3中的两位来控制。CP15中的寄存器C3的格式如下:
这个寄存器中的内容地定义了16种访问域。每一个域用两位表示。但是没有在相关的文档中介绍了16个域的使用。在网上找了一篇文章针对这个C3寄存器的介绍:
关键是看那几位是表示filed7和filed0~filed4。
看到的文档也只是表示了四种,如下图:
由上面的图示介绍,可以看到每一种控制编码代表了一种域以及在这样的控制位下的访问权限的有效性。C3的寄存器中有了有效的四个域。关键是把代表每一种权限访问的位设置为 01,11,或是 10。其它的为 1。
2,除了上述的条件参与到权限访问控制以外,还有其它的要素。就是页表的AP位。下图是一级表项:
注意这个表不是在cpu的寄存器中,而是在内存中。内存中会有一张一级table索引和二级table的索引。这两级别的表项在加上虚拟地址的后12bits组成了物理地址。(这个内容属于虚拟到物理地址转换的范畴)
每一个一级表中都有AP的表述。那么这个AP和cpsr协处理器的C1中的R和S位结合可以表示访问的权限,如下图:
3,实际应用。
1.协处理器CP15中Control Register3:DOMAIN ACCESS CONTROL REGISTER
2.段描述符中的AP位和Domain位
3.协处理器CP15中Control Register1(控制寄存器1)中的S bit和R bit
4.协处理器CP15中Control Register5(控制寄存器5)
5.协处理器CP15中Control Register6(控制寄存器6)
结合上面所涉及的概念具体来看看不同情况下Linux又是如何利用硬件的机制完成权限访问的。
例1:
Discriptor中的domain=4,AP=10(这种情况下S bit ,A bit被忽略)
假设现在我要对该描述符描述的内存区域进行访问:
由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系统会对该访问进行访问权限的检查。
(1)假设当前CPU处于Supervisor模式下,则程序可以对该描述符描述的内存区域进行读写操作。
(2)假设当前CPU处于User模式下,则程序可以对该描述符描述的内存进行读访问,若对其进行写操作则引起一个permission fault.
例2:
Discriptor中的domain=0,AP=10(这种情况下S bit ,A bit被忽略)
domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11,系统对任何内存区域的访问都不进行访问权限的检查。
由于统对任何内存区域的访问都不进行访问权限的检查,所以无论CPU处于合种模式下(Supervisor模式或是User模式),程序对该描述符描述的内存都可以顺利地进行读写操作
例3:
Discriptor中的domain=4,AP=11(这种情况下S bit ,A bit被忽略)
由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系统会对该访问进行访问权限的检查。
由于AP=11,所以无论CPU处于合种模式下(Supervisor模式或是User模式),程序对该描述符描述的内存都可以顺利地进行读写操作
例4:
Discriptor中的domain=4,AP=00, S bit=0,A bit=0
由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系统会对该访问进行访问权限的检查。
由于AP=00,S bit=0,A bit=0,所以无论CPU处于合种模式下(Supervisor模式或是User模式),程序对该描述符描述的内存都只能进行读操作,否则引起permission fault.
4,通过以上4个例子我们得出三个结论:
1,对某个内存区域的访问是否需要进行权限检查是由该内存区域的描述符中的Domain域决定的。
2,某个内存区域的访问权限是由该内存区域的描述符中的AP位和协处理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所决定的。
3,对于不同的空间,处理器处于的工作模式下:svc或是user模式。访问的权限一样会首到控制。
4,访问权限的检查存在于各中场合。
(1)在user模式下一样有RO段的内容。
(2)在user和svc模式下区分的访问权限。