阅读本文需要3分30秒
什么是VIVT, 什么是VIPT,什么又是PIPT,他们之间的区别是什么?
我们都知道处理器中的地址编码寻址采用的都是虚拟地址寻址通过映射才得到物理地址。前文也提过处理器的寻址过程中会使用到cache以提高寻址效率。那么就不得不面对一个问题,cache的组织方式应该使用虚拟地址寻址还是物理地址寻址呢?
前文处理器体系结构(4):ARM架构中神秘的cache中有介绍cache的寻址方式主要依靠cacheline index+tag来确定资源。在ARM9处理器上cache使用的是VIVT的组织方式,VIVT顾名思义就是虚拟的index+虚拟的TAG;而在ARM11上使用的是VIPT的cache组织方式,VIPT顾名思义就是虚拟的Index+物理Tag;而ARM的Cortex-A系列处理器使用的则是PIPT的cache组织方式,同样顾名思义物理的Index+物理的Tag。
![a77fd65f78894e4862cb0fbe917c40ed.png](https://i-blog.csdnimg.cn/blog_migrate/1c2af0b1381e3b1401e2367bb94d33dd.jpeg)
虚拟资源到物理查找流程
上图描述了虚拟地址是怎样最终得到物理地址和数据的,因为cache的组织结构方式的不同导致从虚拟地址到cache的些许不同,具体表现在哪儿呢?
![258e53359746fd3f3fdf45c46e6b37e6.png](https://i-blog.csdnimg.cn/blog_migrate/2c19cdcbe31b48bda370c37bc3fa7a08.jpeg)
cache line=32Byte line number=256 cache结构图
通过上图回顾cache的寻址和cache的结构,下面简述三种方式的特点:
VIVT:Index+Tag都使用虚拟地址编码,那意味着处理器不需要MMU做转换只需要使用虚拟地址来与cache比较就能得到正确的数据。但是这里有一个问题,我们知道虚拟地址映射关系中往往存在多个虚拟地址映射到一个物理地址的情况,这也就意味着一个物理地址的内容有可能出现在多个cache line中,当系统改变了虚拟和物理地址他们之间的映射关系时,我们不得不清洗cache,导致性能的下降。
VIPT:Index使用虚拟地址编码+Tag使用物理地址编码,这样使用虚拟编码的行索引来找到cache使用物理编码的TAG来比对数据的有效性。这同样会遇到上面的cache清洗问题,不过在多任务的操作系统中不必再把TAG置位无效的操作了。有一个特例如果我们管理的页是4KB大小时意味着所有的虚拟地址的低12位是直接映射到物理地址的,而此时如果index恰好又处在低12位中时,就不会存在重命名的问题了,因为所有虚拟地址的低12位是与物理地址一模一样的。
PIPT:Index使用物理地址编码+Tag使用物理地址编码。所有的都使用物理地址编码就不可能存在上面所说的cache重命名问题了,也就不会在多任务系统中需要清洗cache,对TAG做无效操作等降低性能的操作了。不过这对硬件设计的复杂性是一个挑战。
综上所述:很明显PIPT的cache组织方式就是性能最优的了。