概述
高速缓存可以设计成通过虚拟地址或者物理地址来访问,这在处理器设计时就确定下来了,并且对高速缓存的管理有很大的影响。高速缓存可以分成如下3类:
- 虚拟高速缓存(VIVT):使用虚拟地址的索引域和虚拟地址的标记域,相当于虚拟高速缓存。
- 物理高速缓存(PIPT):使用物理地址的索引域和物理地址的标记域,相当于物理高速缓存。
- 物理标记的虚拟高速缓存(VIPT):使用虚拟地址的索引域和物理地址的标记域。
虚拟高速缓存(VIVT)
若处理器使用虚拟地址来寻址高速缓存,这种高速缓存称为虚拟高速缓存。处理器在寻址时,首先把虚拟地址发送到高速缓存,若在高速缓存里找到需要的数据,就不再需要访问TLB和物理内存。虚拟高速缓存的工作流程如图:
重名问题
在操作系统中,多个不同的虚拟地址可能映射相同的物理地址。由于采用虚拟高速缓存,因此这些不同的虚拟地址会占用高速缓存中不同的高速缓存行,但是它们对应的是相同的物理地址,这样会引发问题。第一,浪费高速缓存空间,造成高速缓存等效容量减少,整体性能降低。第二,当执行写操作时,只更新了其中一个虚拟地址对应的高速缓存,而其他虚拟地址对应的高速缓存并没有更新。那么处理器访问其他虚拟地址时可能得到旧数据。
同名问题
同名问题指的是相同的虚拟地址对应不同的物理地址,因为操作系统中不同的进程会存在很多相同的虚拟地址,而这些相同的虚拟地址在经过MMU转换后得到不同的物理地址,这就产生了同名问题。同名问题最常见的地方是进程切换。当一个进程切换到另外一个进程时,若新进程使用虚拟地址来访问高速缓存,新进程会访问到旧进程遗留下来的高速缓存,这些高速缓存数据对于新进程来说是错误和没用的。解决办法是在进程切换时使旧进程遗留下来的高速缓存都无效,这样就能保证新进程执行时得到“干净的”虚拟高速缓存。同样,需要使TLB无效,因为新进程在切换后会得到一个旧进程使用的TLB,里面存放了旧进程的虚拟地址到物理地址的转换结果,这对于新进程来说是无用的,因此需要把TLB清空。
物理高速缓存(PIPT)
当处理器查询MMU和TLB并得到物理地址之后,使用物理地址查询高速缓存,这种高速缓存称为物理高速缓存。使用物理高速缓存的缺点就是处理器在查询MMU和TLB后才能访问高速缓存,增加了流水线的延迟时间。物理高速缓存的工作流程如图:
物理标记的虚拟高速缓存(VIPT)
处理器输出的虚拟地址会同时发送到TLB/MMU进行地址翻译,以及在高速缓存中进行索引和查询高速缓存。在TLB/MMU里,会把VPN翻译成PFN,同时用虚拟地址的索引域和偏移量来查询高速缓存。高速缓存和TLB/MMU可以同时工作,当TLB/MMU完成地址翻译后,再用物理标记域来匹配高速缓存行。VIPT的工作流程如图:
相关参考
- 《奔跑吧,Linux内核》
- 《计算机组成与体系结构——性能设计》