分页浏览是否利用共享表?

时间:2019-12-02 19:26:05

标签: performance cpu-architecture virtual-memory mmu page-tables

假设两个地址空间共享大量的非连续内存。 系统可能希望在它们之间共享物理页表。 这些表将不使用 Global 位(即使受支持),并且会将它们绑定到 asid (如果受支持)。

有直接的好处,因为与复制,固定的ram等相比,数据缓存的污染更少。

在任何已知的体系结构中,分页浏览是否具有显式的优势? 如果是这样,这是否意味着 mmu 正在基于物理标记显式缓存和共享内部页面树节点?

很抱歉有多个问题;这真的是一个细分。我正在尝试确定是否值得为此设计测量测试。

1 个答案:

答案 0 :(得分:3)

在现代的x86 CPU(如Sandybridge系列)上,页面遍历通过缓存层次结构(L1d / L2 / L3)进行获取,因此,存在一个明显的好处,那就是必须将不同的页面目录指向同一子树进行共享虚拟地址空间的区域。或对于某些AMD,跳过L1d进入L2。

What happens after a L2 TLB miss?详细了解了页面遍历一定会通过缓存获取的事实,例如设有Broadwell性能计数器来衡量点击率。

(“” MMU“是CPU内核的一部分; L1dTLB与加载/存储执行单元紧密耦合。页面漫游器是一个非常独立的东西,与指令执行并行运行,但仍然是其中一部分可以通过推测触发等。因此它紧密耦合,足以通过L1d缓存访问内存。)


更高级别的PDE(页面目录条目)可能值得在页面漫游硬件中进行缓存。 this paper的第3节确认英特尔和AMD实际上在实践中这样做,因此you need to flush the TLB in cases where you might think you didn't need to

但是,我认为您不会发现PDE缓存是在顶层页面表的更改中发生的。

在x86上,您要在CR3上安装带有mov的新页表;隐式刷新所有缓存的翻译和内部的page-walker PDE缓存,就像invlpg对一个虚拟地址所做的那样。 (或使用ASID,使来自不同ASID的TLB条目不可用于匹配)。

主要问题是TLB和page-walker内部缓存与主内存/数据缓存不一致。我认为所有执行HW页面漫游的ISA都需要手动刷新TLB,具有x86之类的语义,用于安装新的页表。 (有些MIPS等ISA仅执行软件TLB管理,并调用特殊的内核TLB缺失处理程序;您的问题不适用于此。)

是的,他们可以检测到相同的物理地址,但是出于理智,您还必须避免使用从存储到该物理地址的过时缓存数据。

在页表存储和TLB / pagewalk之间没有硬件管理的一致性,就不可能安全地进行此缓存。

说;某些x86 CPU确实超出了纸上的性能范围,并且与商店之间的一致性有限,但只有保护您免受投机性页面漫游,才能与假定有效但尚未使用的PTE可以修改的OS向后兼容没有invlpghttp://blog.stuffedcow.net/2015/08/pagewalk-coherence/

因此,微体系结构窥探商店以检测一定范围内的商店并非没有听说过;您可以合理地使商店在探查步行者内部缓存的位置附近监听地址范围,从而有效地为内部探寻步行者的缓存提供一致性。

实际上,

现代x86 确实会通过监听来检测任何飞行指令附近的商店的自我修改代码。 Observing stale instruction fetching on x86 with self-modifying code在这种情况下,窥探命中是通过使整个后端状态退回到退出状态来处理的。

因此,您可以可以在理论上设计一种具有高效机制的CPU,以便能够透明地利用此优势,但是它具有重要意义< / em>成本(将每个商店靠CAM侦听以检查页面行者缓存的地址上的匹配项)的收益非常低。除非我缺少任何东西,否则我认为没有更简单的方法可以做到这一点,所以我敢打赌,没有真正的设计实际上可以做到这一点。

很难想象在x86之外;几乎所有其他内容都采用“较弱” /“较少保证”的方法,并且只会监听存储缓冲区(用于存储转发)。 CAM(内容可寻址内存=硬件哈希表)非常耗电,处理命中的特殊情况会使管道复杂化。尤其是OoO exec管道,在该管道中,到PTE的存储可能要等到加载要使用该TLB条目之后,才能准备好其存储地址。引入更多的管道核武器是一件坏事。


这样做的好处很小

第一次 页面遍历从L1d缓存中获取数据后(或者如果L1d中也不热的话,则走得更远),然后然后在page-walker机制可以正常运行。

因此,在下一个上下文切换可以从page-walker内部缓存中受益之前,可以对附近的页面进行进一步的页面遍历。这是有好处的,这是某些真正的硬件所要做的(至少是某些x86;有关其他硬件的IDK)。

以上所有关于为何需要对相干页表进行监听的论点都是关于使page-walker内部缓存在上下文切换中保持“热”状态。

L1d可以轻松地做到这一点;行为类似于PIPT(无别名)的VIPT缓存仅基于物理地址进行缓存,不需要在上下文切换时进行刷新。

如果您经常频繁地上下文切换 ,则ASID可让TLB条目正确保持缓存状态。如果您仍然遇到许多TLB未命中的情况,最坏的情况是它们必须从头开始一直通过高速缓存获取数据。 这确实不错,而且不值得花很多晶体管和功率预算。


我只考虑裸机上的操作系统,而不考虑带有嵌套页面表的硬件虚拟化。 (管理程序虚拟化来宾操作系统的页表)。我认为所有相同的论点基本上都适用。遍历页面绝对仍然可以通过缓存获取。