页面遍历是否利用了共享表?
Does page walk take advantage of shared tables?
假设两个地址空间共享一个较大的非连续内存块。
系统可能希望在它们之间共享物理页面 table(s)。
这些 tables 不会使用 Global 位(即使支持),如果支持,会将它们绑定到 asids。
有立竿见影的好处,因为数据缓存比副本、更少固定的 ram 等污染更少。
页面遍历是否在任何已知架构中显式利用了这一点?
如果是这样,是否意味着 mmu 显式缓存和共享基于物理标签的内部页面树节点?
抱歉提出了多个问题;它真的是一个坏掉的。我正在尝试确定是否值得为此设计一个测量测试。
在现代 x86 CPUs(如 Sandybridge-family)上,页面遍历缓存层次结构(L1d / L2 / L3),所以是的,必须指向不同的页面目录有一个明显的好处到虚拟地址 space 的共享区域的同一子树。或者对于某些 AMD,通过 L2 获取,跳过 L1d。
What happens after a L2 TLB miss? 有更多关于页面遍历确实通过缓存获取的事实的详细信息,例如Broadwell 性能计数器用于衡量点击率。
("The MMU" 是 CPU 核心的一部分;L1dTLB 与 load/store 执行单元紧密耦合。不过,页面漫游器是一个相当独立的东西,并且在与指令执行并行,但仍然是核心的一部分,可以推测性地触发等。所以它足够紧密地耦合,可以通过 L1d 缓存访问内存。)
更高级别的 PDE(页面目录条目)值得缓存在页面遍历硬件中。 this paper confirms that Intel and AMD actually do this in practice, so you need to flush the TLB in cases where you might think you didn't need to 的第 3 节。
但是,我认为您不会发现 PDE 缓存发生在顶级页面的更改中 -tables.
在 x86 上,您安装一个带有 mov
的新页面 table 到 CR3;隐式地刷新所有缓存的翻译和内部页面 walker PDE 缓存,就像 invlpg
对一个虚拟地址所做的那样。 (或者使用 ASID,使来自不同 ASID 的 TLB 条目不可用于命中)。
主要问题是 TLB 和页面遍历器内部缓存与主内存/数据缓存不一致。我认为所有进行硬件页面遍历的 ISA 都需要手动刷新 TLB,使用 x86 等语义来安装新页面 table。 (一些像 MIPS 这样的 ISA 只做软件 TLB 管理,调用一个特殊的内核 TLB-miss 处理程序;你的问题在那里不适用。)
所以是的,他们可以检测到相同的物理地址,但为了理智起见,您还必须避免使用存储到该物理地址后的陈旧缓存数据。
如果页面 table 存储和 TLB/pagewalk 之间没有硬件管理的一致性,这个缓存就不可能安全地发生。
也就是说;一些 x86 CPUs 确实超出了纸面上的范围,并且与商店的一致性有限,但只是保护您免受 推测性 页面遍历以向后兼容 OSes假设可以在没有 invlpg
的情况下修改有效但尚未使用的 PTE。 http://blog.stuffedcow.net/2015/08/pagewalk-coherence/
因此,微架构窥探商店以检测特定范围内的商店并非闻所未闻;您可以合理地让存储窥探 page-walker 内部缓存位置附近的地址范围,从而有效地为内部 page-walker 缓存提供连贯性。
现代 x86 确实 在实践中通过窥探任何运行中指令附近的存储来检测自修改代码。 Observing stale instruction fetching on x86 with self-modifying code 在这种情况下,通过将整个后端状态恢复到退休状态来处理窥探命中。
所以你可以在理论上设计一个CPU具有有效机制的CPU是合理的,能够透明地利用这个,但它具有 显着 成本(针对 CAM 侦听每家商店以检查 page-walker 缓存地址上的匹配项)以获得非常低的收益。除非我遗漏了什么,否则我认为没有更简单的方法可以做到这一点,所以我敢打赌没有真正的设计真正做到这一点。
在 x86 之外很难想象;几乎所有其他东西都采用 "weaker" / "fewer guarantees" 方法并且只会窥探存储缓冲区(用于存储转发)。 CAM(内容可寻址内存 = 硬件哈希 table)非常耗电,处理命中的特殊情况会使管道复杂化。特别是 OoO exec 管道,其中 PTE 的存储可能直到加载想要使用该 TLB 条目之后才准备好其存储地址。引入更多管道核武器是一件坏事。
这样做的好处很小
在 first page-walk 从 L1d 缓存中获取数据后(或者更远,如果它在 L1d 中也不热),然后 通常的 cache-within-page-walker 机制可以正常运行。
因此,在下一次上下文切换之前,对附近页面的进一步页面遍历可以受益于页面遍历器内部缓存。这有好处,并且是一些真正的硬件所做的(至少一些 x86;关于其他的 IDK)。
上面关于为什么这需要窥探连贯页面 tables 的所有论点都是关于让 page-walker 内部缓存 在上下文切换时保持 热。
L1d 可以轻松做到这一点;行为类似于 PIPT(无别名)的 VIPT 缓存仅基于物理地址进行缓存,并且不需要在上下文切换时刷新。
如果您非常 频繁地进行上下文切换,ASID 可以让 TLB 条目适当地保持缓存状态。如果您仍然遇到很多 TLB 未命中,最坏的情况是它们必须从顶部一直通过缓存获取。 这真的不错,非常不值得花费大量晶体管和功率预算。
我只考虑 OS 在裸机上,而不是带有嵌套页面 table 的硬件虚拟化。 (管理程序虚拟化来宾 OS 的页面 tables)。不过,我认为所有相同的论点基本上都适用。页面遍历仍然肯定会通过缓存获取。
假设两个地址空间共享一个较大的非连续内存块。 系统可能希望在它们之间共享物理页面 table(s)。 这些 tables 不会使用 Global 位(即使支持),如果支持,会将它们绑定到 asids。
有立竿见影的好处,因为数据缓存比副本、更少固定的 ram 等污染更少。
页面遍历是否在任何已知架构中显式利用了这一点? 如果是这样,是否意味着 mmu 显式缓存和共享基于物理标签的内部页面树节点?
抱歉提出了多个问题;它真的是一个坏掉的。我正在尝试确定是否值得为此设计一个测量测试。
在现代 x86 CPUs(如 Sandybridge-family)上,页面遍历缓存层次结构(L1d / L2 / L3),所以是的,必须指向不同的页面目录有一个明显的好处到虚拟地址 space 的共享区域的同一子树。或者对于某些 AMD,通过 L2 获取,跳过 L1d。
What happens after a L2 TLB miss? 有更多关于页面遍历确实通过缓存获取的事实的详细信息,例如Broadwell 性能计数器用于衡量点击率。
("The MMU" 是 CPU 核心的一部分;L1dTLB 与 load/store 执行单元紧密耦合。不过,页面漫游器是一个相当独立的东西,并且在与指令执行并行,但仍然是核心的一部分,可以推测性地触发等。所以它足够紧密地耦合,可以通过 L1d 缓存访问内存。)
更高级别的 PDE(页面目录条目)值得缓存在页面遍历硬件中。 this paper confirms that Intel and AMD actually do this in practice, so you need to flush the TLB in cases where you might think you didn't need to 的第 3 节。
但是,我认为您不会发现 PDE 缓存发生在顶级页面的更改中 -tables.
在 x86 上,您安装一个带有 mov
的新页面 table 到 CR3;隐式地刷新所有缓存的翻译和内部页面 walker PDE 缓存,就像 invlpg
对一个虚拟地址所做的那样。 (或者使用 ASID,使来自不同 ASID 的 TLB 条目不可用于命中)。
主要问题是 TLB 和页面遍历器内部缓存与主内存/数据缓存不一致。我认为所有进行硬件页面遍历的 ISA 都需要手动刷新 TLB,使用 x86 等语义来安装新页面 table。 (一些像 MIPS 这样的 ISA 只做软件 TLB 管理,调用一个特殊的内核 TLB-miss 处理程序;你的问题在那里不适用。)
所以是的,他们可以检测到相同的物理地址,但为了理智起见,您还必须避免使用存储到该物理地址后的陈旧缓存数据。
如果页面 table 存储和 TLB/pagewalk 之间没有硬件管理的一致性,这个缓存就不可能安全地发生。
也就是说;一些 x86 CPUs 确实超出了纸面上的范围,并且与商店的一致性有限,但只是保护您免受 推测性 页面遍历以向后兼容 OSes假设可以在没有 invlpg
的情况下修改有效但尚未使用的 PTE。 http://blog.stuffedcow.net/2015/08/pagewalk-coherence/
因此,微架构窥探商店以检测特定范围内的商店并非闻所未闻;您可以合理地让存储窥探 page-walker 内部缓存位置附近的地址范围,从而有效地为内部 page-walker 缓存提供连贯性。
现代 x86 确实 在实践中通过窥探任何运行中指令附近的存储来检测自修改代码。 Observing stale instruction fetching on x86 with self-modifying code 在这种情况下,通过将整个后端状态恢复到退休状态来处理窥探命中。
所以你可以在理论上设计一个CPU具有有效机制的CPU是合理的,能够透明地利用这个,但它具有 显着 成本(针对 CAM 侦听每家商店以检查 page-walker 缓存地址上的匹配项)以获得非常低的收益。除非我遗漏了什么,否则我认为没有更简单的方法可以做到这一点,所以我敢打赌没有真正的设计真正做到这一点。
在 x86 之外很难想象;几乎所有其他东西都采用 "weaker" / "fewer guarantees" 方法并且只会窥探存储缓冲区(用于存储转发)。 CAM(内容可寻址内存 = 硬件哈希 table)非常耗电,处理命中的特殊情况会使管道复杂化。特别是 OoO exec 管道,其中 PTE 的存储可能直到加载想要使用该 TLB 条目之后才准备好其存储地址。引入更多管道核武器是一件坏事。
这样做的好处很小
在 first page-walk 从 L1d 缓存中获取数据后(或者更远,如果它在 L1d 中也不热),然后 通常的 cache-within-page-walker 机制可以正常运行。
因此,在下一次上下文切换之前,对附近页面的进一步页面遍历可以受益于页面遍历器内部缓存。这有好处,并且是一些真正的硬件所做的(至少一些 x86;关于其他的 IDK)。
上面关于为什么这需要窥探连贯页面 tables 的所有论点都是关于让 page-walker 内部缓存 在上下文切换时保持 热。
L1d 可以轻松做到这一点;行为类似于 PIPT(无别名)的 VIPT 缓存仅基于物理地址进行缓存,并且不需要在上下文切换时刷新。
如果您非常 频繁地进行上下文切换,ASID 可以让 TLB 条目适当地保持缓存状态。如果您仍然遇到很多 TLB 未命中,最坏的情况是它们必须从顶部一直通过缓存获取。 这真的不错,非常不值得花费大量晶体管和功率预算。
我只考虑 OS 在裸机上,而不是带有嵌套页面 table 的硬件虚拟化。 (管理程序虚拟化来宾 OS 的页面 tables)。不过,我认为所有相同的论点基本上都适用。页面遍历仍然肯定会通过缓存获取。