我无法完全掌握VIPT缓存中的同义词或别名的概念。
考虑将地址拆分为: -
在这里,假设我们有2个页面,不同的VA映射到相同的物理地址(或帧号)。
不同的VA(比特13-39)的页面部分被转换为PA的PFN(比特12-35),并且PFN保持相同,因为它们被映射到相同的物理帧。
现在,两个VA的页面偏移部分(位0-13)与它们想要从特定帧访问的数据相同,不相同。
由于两个VA的页面偏移部分相同,所以位(5-13)也是相同的,因此索引或集合no是相同的,因此不应该存在别名,因为只有单个集合或索引no被映射到物理帧没有。
第12位如图所示,负责别名?我无法理解这一点。
如果有人可以借助地址给出一个例子,那就太好了。
谢谢 。
页面偏移是位0-11,而不是0-13。查看底部图表:页面偏移量是低12位,因此您有4k页面(如x86和其他常见架构)。
如果任何索引位来自页面偏移量之上,则VIPT不再像具有索引位的自由转换的PIPT那样。就是这种情况。
进程可以将相同的物理页面(帧)映射到2个不同的虚拟页面。
您声称不同的VA(第13-39位)的页面部分被转换为PA的PFN(位12-35)并且PFN的PFN保持相同是完全虚假的。翻译可以改变第12位。因此,其中一个索引位实际上是虚拟的而不是物理的,因此同一物理线路的两个条目可以位于不同的集合中。
我认为我的主要困惑在于页面偏移范围。 PA和VA(即0-11)是相同的还是VA为0-12,PA为0-11?他们会一直相同吗?
PA和VA总是一样的。页面偏移量未在图表的VA部分标记,仅标记为用作索引的位数范围。
它与任何不同都没有意义:虚拟和物理内存都是字节可寻址的(或字可寻址的)。当然,页面框架(物理页面)与虚拟页面的大小相同。在从虚拟到物理的翻译过程中向右或向左移动地址是没有意义的。
正如评论中所讨论的:
我最终找到了http://www.cse.unsw.edu.au/~cs9242/02/lectures/03-cache/node8.html(其中包括问题中的图表!)。它说同样的事情:物理标记确实解决了缓存同音词问题,作为在上下文切换上刷新的替代方法。
但不是同义词问题。为此,您可以让操作系统确保每个VA的第12位=每个PA的第12位。这称为页面着色。
页面着色也可以解决同音词问题,而硬件不会重叠标记位,因为它在物理和虚拟地址之间提供了1个相同的位。 phys idx = virt idx。 (但是,如果它想要依赖于这个不变量,硬件将依赖软件是正确的。)
在标记期间,标记与索引重叠的另一个原因是回写:
外部缓存几乎总是PIPT,内存本身显然需要物理地址。因此,当您将其发送到内存层次结构时,您需要一行的物理地址。
在完成对存储的TLB检查之后,回写高速缓存需要能够驱逐脏线(将它们发送到L2或物理RAM)。与加载不同,除非将其存储在某处,否则您仍然没有浮动TLB结果。 How does the VIPT to PIPT conversion work on L1->L2 eviction
使标记包括页面偏移之上的所有物理地址位解决了这个问题:给定页面偏移索引位和标记,您可以构造完整的物理地址。
(另一个解决方案是直写缓存,所以你总是有TLB的物理地址与数据一起发送,即使它不能从缓存标记+索引重构。或者只读缓存,例如指令缓存,没有回写; eviction = drop。)