MMU与cache
这一快理解的非常浅:
MMU
虚拟存储器对内存进行了逻辑上的扩充。比如一个32位的CPU系统,逻辑上的寻址可以达到4GB,但是如果直接对物理地址进行寻址,就要受到主存大小的限制。
在这种条件下,虚拟地址应运而生,每个应用程序的访存空间都可以达到4GB,当然这里用的是虚拟地址。Cpu发出虚拟地址之后会被转化为MVA(变化后的虚拟地址),MMU接收到MVA,将MVA转化为物理地址。
现在,先来看看第一个阶段,VA(虚拟地址)转化为MVA:
上图就是VA转化为MVA的算法,va转化为MVA需使用进程标示号PID,这个过程是由硬件自动完成的。这样做有一个好处,当两个程序的va都是0-(32M-1)的时候,他们的MVA并不会重叠,免去了处理VA冲突的过程(处理VA冲突需要重建页表,使无效CACHE,和TLBS等,代价昂贵)。
第二个阶段,将MVA转化为物理地址:
主要过程如下:
1. 根据给定的MVA中的一级页表索引和TTB找到一级列表中的条目。
2. 如果此条目是段描述符(最后两位标示),则根据段描述符和段内地址直接读取到物理地址。
3. 如果此条目是二级页描述符,则利用此描述符和二级页表索引找到二级页表中的下一个条目。
4. 如果此条目是页描述符,则根据此描述符和页内地址直接找到物理地址。
5. 其他情况出错。
可以看出,一级页表需要两次访存能够找到真正的物理地址。二级页表需要三次访存才能找到物理地址。
下面介绍一个二级页表找到物理地址的例子::
首先MVA如下:
然后根据TTB得出粗页表中条目的位置:
取出一级页表中此地址的数值,并得出二级页表中的条目的地址:
取出二级条目中此地址的数值,和页内索引得出真实的物理地址:
至此,完事。
注:上图中红色区域就是对是段还是页表还是哪种描述符的标示。
对于几个寄存器的说明:
TTB:也就是协处理器C15的2号寄存器,存的是当前页表的基地址。
TLB:其实就是页表条目的cache,储存近期用过的页表条目,避免每次都要去主存进行查询。
CACHE
两种写数据方式:
1. 写穿式:cpu写入cache时,同时写入主存。
2. 回写式:只有当cache中的数据被换出或清空时,才将更新的数据写入主存。
Cache的两种操作:
1. 清空:把cache或写缓冲中已经脏的数据(修改过,但未写入主存)写入主存。
2. 使无效:使之不能再使用,不将脏的数据写回主存。
Cache分为指令cache和数据cache