我无法完全掌握VIPT缓存中的同义词或别名的概念。
将地址拆分为: -
在这里,假设我们有2个页面,不同的VA映射到相同的物理地址(或帧号)。
不同的 pageno部分VA (位13-39)被转换为 PA的PFN (位12-35)并且两者的PFN保持相同VA被映射到相同的物理帧。
现在,两个VA的 pageoffset 部分(位0-13)与他们想要从特定帧访问的数据相同,不相同。
由于两个VA的页面偏移部分相同,位(5-13)也是相同的,所以索引或设置no是相同的因此应该有 no aliasing ,因为只有单个集合或索引no映射到物理帧号。
如图所示,第12位如何负责别名?我无法理解。
如果有人可以借助地址提供一个例子,那就太好了。
谢谢。
答案 0 :(得分:6)
页面偏移是0-11位,而不是0-13。查看底部图表:页面偏移量为低12位,因此您有4k页面(如x86和其他常见架构)。
如果任何索引位来自页面偏移量之上,则VIPT不再像PIPT那样具有索引位的自由转换。这就是这种情况。
进程可以将相同的物理页面(帧)映射到2个不同的虚拟页面。
你声称不同的VA(第13-39位)的页面部分被转换为PA的PFN(第12-35位),并且PFN对于两个VA都保持相同完全是虚假的。翻译可以改变第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。)