开启虚拟地址使能的系统上,CPU发起的访问最初都是虚拟地址VA,而真正从物理主存中获取内容需给内存控制器的地址是物理地址PA,所以在CPU发起访问后,需要一系列的动作完成VA到PA的转换,这需要OS和硬件协同来完成。一些概念如MMU,TLB,页表等如下所述:http://blog.csdn.net/kklvsports/article/details/9208511。简要过程如下:VA以页表大小取余,得到PA的低位,关键是PA的高位(PFN)如何得到。内存中存放着页表,页表记录的是VPN到PFN的对应关系(一般可能会分为多级页表),以VPN查询页表即可获得PFN。为了加速这个查询,引入了TLB,TLB记录的是一个内存页表的一个子集,相当于是内存页表的缓存。所以MMU在以VPN索引先在TLB中查找页表,如果查询TLB miss则会产生异常,由异常处理程序进行地址转换。
VA转换需要的相关寄存器:
EntryHi寄存器,各个位域的含义如下:
ASID: Address Space ID地址空间标示符
VPN2:Virtual PageNumber 虚拟页号,2意思mips映射两个物理页表
Fill:VPN2的扩展
R:MIPS64才有,意义如下
PageMask寄存器用于配置页表大小:
EntryLo0/EntryLo1寄存器
G:globalflag全局标志,如果该bit置位,在TLB匹配的时候忽略ASID
V:validflag有效标志
D:dirtyflag“脏”标志,指示该页是否可写,为1表示可写
C:cacheabilityand Coherency
PFN:pageframe number物理帧号
Fill: 该位域对写操作,读操作返回全0;
虚拟地址转换为物理地址过程为:
虚拟地址的高位(VPN)和当前程序的ASID送给TLB,与TLB中的所有entry表项同时进行匹配,匹配过程中如果有如下都满足的TLB表项,从中读取PFN,V,D域
1.当前程序(进程)的ASID等于TLB表项中的ASID(EntryHi的Gbit置位的话,不比较ASID)
2.虚拟地址的bit63~62与TLB表项的R字段相同
3.虚拟地址的相应位域和TLB的VPN2相同,相应位域取决于PageMask寄存器设置的页表大小
注意最终转换是否成功取决于V,D域。如果V无效,该entry无效,产生TLB无效异常;如果D指示不可写,而有写操作会产生TLB修改异常。如果没有上述异常,即是TLB命中,命中entry的PFN和虚拟地址低位(1KBpage的话是低10bit,4KBpage的话低12bit)构成最终的物理地址。