mev*_*ets 2 performance cpu-architecture virtual-memory mmu page-tables
假设两个地址空间共享一块较大的非连续内存。系统可能希望在它们之间共享物理页表。这些表不会使用全局位(即使支持),并且如果支持的话会将它们绑定到asid。
这样做有直接的好处,因为数据缓存的污染比副本、更少的固定内存等污染要少。
页面遍历是否在任何已知架构中明确利用了这一点?如果是这样,这是否意味着mmu正在根据物理标签显式缓存和共享内部页面树节点?
很抱歉提出了多个问题;这确实是一件坏事。我正在尝试确定是否值得为此设计一个测量测试。
在现代 x86 CPU(如 Sandybridge 系列)上,页面遍历通过缓存层次结构(L1d / L2 / L3)获取,因此,不同的页面目录指向虚拟共享区域的同一子树有一个明显的好处地址空间。或者对于某些 AMD,通过 L2 获取,跳过 L1d。
L2 TLB 未命中后会发生什么?有更多关于页面遍历肯定会通过缓存获取这一事实的详细信息,例如 Broadwell 性能计数器用于测量命中率。
(“MMU”是 CPU 核心的一部分;L1dTLB 与加载/存储执行单元紧密耦合。尽管页面遍历器是一个相当独立的东西,并且与指令执行并行运行,但仍然是核心的一部分并且可以推测性地触发等。因此它的耦合足够紧密,可以通过 L1d 缓存访问内存。)
更高级别的 PDE(页面目录条目)值得在页面遍历硬件内进行缓存。本文 的第 3 节证实了 Intel 和 AMD 在实践中确实这样做了,因此在您可能认为不需要的情况下,您需要刷新 TLB。
但是,我认为您不会发现 PDE 缓存发生在顶级页表的更改中。
在 x86 上,您安装一个新的页表,其值为movCR3;隐式刷新所有缓存的翻译和内部页遍历器 PDE 缓存,就像invlpg对一个虚拟地址所做的那样。(或者使用 ASID,使来自不同 ASID 的 TLB 条目无法命中)。
主要问题是 TLB 和页遍历器内部缓存与主内存/数据缓存不一致。 我认为所有执行硬件页面遍历的 ISA 都需要手动刷新 TLB,并使用类似于 x86 的语义来安装新页表。(一些 ISA(例如 MIPS)仅执行软件 TLB 管理,调用特殊的内核 TLB 未命中处理程序;您的问题在那里不适用。)
所以是的,他们可以检测到相同的物理地址,但为了理智起见,您还必须避免使用从存储到该物理地址之后的陈旧缓存数据。
如果页表存储和 TLB/pagewalk 之间没有硬件管理的一致性,这种缓存就不可能安全地发生。
也就是说;一些 x86 CPU 确实超出了纸面上的内容,并且与存储的一致性有限,但只是保护您免受推测性页面遍历的影响,以便与操作系统向后兼容,这些操作系统假设可以在没有invlpg. http://blog.stuffedcow.net/2015/08/pagewalk-coherence/
因此,微架构窥探存储以检测特定范围内的存储的情况并非闻所未闻。您可以让存储监听页面遍历器内部缓存的位置附近的地址范围,从而有效地为内部页面遍历器缓存提供一致性。
现代 x86实际上确实通过监听任何运行中指令附近的存储来检测自修改代码。 使用自修改代码观察 x86 上的过时指令获取 在这种情况下,通过将整个后端状态恢复到退休状态来处理窥探命中。
因此,理论上您可以设计一个具有有效机制的 CPU,以便能够透明地利用这一点,但它的成本很高(针对 CAM 监听每个存储以检查页面遍历器缓存地址上的匹配)效益极低。除非我遗漏了一些东西,否则我认为没有更简单的方法可以做到这一点,所以我敢打赌,没有真正的设计实际上做到了这一点。
在 x86 之外很难想象;几乎所有其他事情都采用“较弱”/“较少保证”的方法,并且只会监听存储缓冲区(用于存储转发)。CAM(内容可寻址内存=硬件哈希表)非常耗电,处理命中的特殊情况会使管道变得复杂。特别是 OoO 执行管道,其中 PTE 的存储可能没有准备好其存储地址,直到加载想要使用该 TLB 条目之后。引入更多的管道核武器是一件坏事。
当第一个page-walk 从 L1d 缓存(或者更远的地方,如果 L1d 也不热的话)获取数据后,通常的页内缓存机制就可以正常工作了。
因此,在下一次上下文切换之前,对附近页面的进一步页面遍历可以从页面遍历器内部缓存中受益。这有好处,并且是一些真正的硬件所做的(至少是一些 x86;不知道其他的)。
上面所有关于为什么需要监听一致页表的争论都是关于让页面遍历器内部缓存在上下文切换期间保持热状态。
L1d 可以轻松做到这一点;VIPT 缓存的行为类似于 PIPT(无别名),只是根据物理地址进行缓存,不需要在上下文切换时刷新。
如果您非常频繁地进行上下文切换,ASID 可以让 TLB 条目正确地保留在缓存中。如果仍然出现大量 TLB 未命中,最坏的情况是它们必须从顶部一直通过缓存获取。 这确实不错,而且非常不值得花费大量晶体管和功率预算。
我只考虑裸机上的操作系统,而不是具有嵌套页表的硬件虚拟化。(管理程序虚拟化来宾操作系统的页表)。不过,我认为所有相同的论点基本上都适用。页面遍历肯定仍然通过缓存获取。
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |