MMU其实就是一个页表。将虚拟地址通过查表的方式,对应到物理地址去他由一个或一组芯片组成,一般存在与协处理器中。
1.将虚拟地址转化为物理地址
2.访问权限管理
这里先讲内存映射功能,
MMU可以将CPU寻址的虚拟内存转化为实际的物理内存,通过查表的方式,这样满足多进程或者超过物理内存的虚拟内存(通过将需要的内容从硬盘or存储器拷贝到内存,再将暂时不用的内存存回硬盘or存储器)
MMU要自动进行虚拟地址到物理地址的转化,首先要找到一级页表,而一级页表的基地址(TTB:translation table base)则是保存在CP15的C2寄存器中。因此,当程序员创建好相应的页表后,需要将页表基地址写入该寄存器。(ARM11文档)
MMU有一级转换和二级转换,其实就是查几次表。对于一级转换,就是只查一次页表,就确定了物理地址。这个在S3C6410中,方式是段映射。对于二级转换,就要查两次页表或者三次,才能确定物理地址,这个在S3C6410中。有两种方式,一种细页方式,一种粗页方式。这两种的区别就是每一页对应的大小不一样而已。
6410支持两种格式的页表:
1.支持子页面访问模式的向后拓展模式。
2. ARMv6格式,不支持子页面访问权限,但支持ARMv6 MMU特性,还添加了TrustZone的NS属性位。
特性有
- 扩展区域类型
- 全局和处理特定页面
- 更多的访问权限
- 具有共享区域和非共享区域标记
- 具有从不执行区域标记。
两种模式下P:如果支持并为内存区域设置P位,则向系统内存控制器表明该内存区域已启用ECC,一项内存校验纠错功能。ARM1176JZF-S处理器不支持P位。
当第一级描述符的位[1:0]为b01时,描述符指向第二级页表,称为粗页表。
b01则为段模式。无效翻译bits b00及保留项的翻译b11,均会导致翻译错误。
向后拓展模式:
一级描述符格式
二级描述符格式
页表查找示意图:
ARMv6格式:
一级描述符
二级描述符
页表查找示意图:
查找模式详解:
首先,内存映射可以被分为2部分,表0与表1,他们由参数N来控制,N的值被写入TTBCR来完成设置。N与表0的大小如下所示:
在做页表查询时会根据虚拟地址的高N位是否为零判断用哪个表(为0用0表,不为0用1表)
这里详细讲一下段页表,其他的页表建立模式只是层数和格式不同,并无太大区别(我看着是这样)
建立过程首先根据页表起始地址与虚拟地址高12位找到页表地址,之后将高12位赋值为物理地址高12位,AP位访问权限设为11, domain为0,XN为1,C,B根据需求设定,加快运行速率的选项。
这样就完成的一项页表的创建,需要哪些映射就创建那些。
创建完页表后就准备开启MMU
首先将MMU的物理地址传入,无效ICaches和DCaches,无效指令、数据TLB,与访问控制器均为11,不进行权限检查(没做权限的那些东西,以后做),写页表基地址,读控制寄存器的并逐位修改,
控制寄存器的低16位含义为:。RVI 。。RS B。。。 。CAM,。表示无关位
* R : 表示换出Cache中的条目时使用的算法,
* 0 = Random replacement;1 = Round robin replacement
* V : 表示异常向量表所在的位置,
*0 = Low addresses = 0x00000000;1 = High addresses = 0xFFFF0000
* I : 0 = 关闭ICaches;1 = 开启ICaches
* R、S : 用来与页表中的描述符一起确定内存的访问权限
* B : 0 = CPU为小字节序;1 = CPU为大字节序
* C : 0 = 关闭DCaches;1 = 开启DCaches
* A : 0 = 数据访问时不进行地址对齐检查;1 = 数据访问时进行地址对齐检查
* M : 0 = 关闭MMU;1 = 开启MMU
按需要进行设置,并最后开启MMU
实现了MMU虚拟地址映射