CPU如何通过TLB和缓存发出数据请求?

3
我正在观察最近几个Intel微架构(Nehalem/SB/IB和Haswell)。我试图弄清楚数据请求发生时会发生什么(在一个相当简化的水平上)。到目前为止,我有这个大致的想法:
  1. 执行引擎发出数据请求
  2. “内存控制器”查询L1 DTLB
  3. 如果上述未命中,则现在查询L2 TLB
此时会发生两件事情,未命中或命中:
  1. 如果是命中,CPU尝试L1D/L2/L3缓存、页表,然后按顺序访问主存储器/硬盘?

  2. 如果未命中-CPU请求(集成内存控制器?)请求检查保存在RAM中的页表(我在那里是否正确地理解了IMC的作用?)。

如果有人可以编辑/提供一组项目符号,其中包含从执行引擎数据请求开始提供基本“概述”的内容,包括
  • L1 DTLB(数据TLB)
  • L2 TLB(数据+指令TLB)
  • L1D缓存(数据缓存)
  • L2缓存(数据+指令缓存)
  • L3缓存(数据+指令缓存)
  • 控制访问主存储器的CPU部分
  • 页表
我将非常感激。我确实找到了一些有用的图像: 但它们并没有真正区分TLB和高速缓存之间的交互。
更新:已更改上述内容,因为我认为我现在理解了。TLB只是从虚拟地址获取物理地址。如果未命中-我们就有麻烦了,需要检查页表。如果命中,我们只需按顺序进行内存层次结构,从L1D缓存开始。

还可以看到同一个用户关于页面行走加载以解决TLB缺失是否来自缓存的问题。我找到了一些有趣的东西。 - undefined
2个回答

9

页面映射仅适用于虚拟地址到物理地址的转换。然而,由于它存储在内存中并且只有部分缓存在TLB中,在转换过程中可能需要在那里访问它。

基本流程如下:

  1. 执行计算地址(实际上一些计算,如比例和偏移量可以在内存单元中完成)。
  2. 在DTLB中查找
    2.a. 如果未命中,则在第二级TLB中查找。
    2.a.a. 如果未命中 - 开始页表遍历。
    2.a.b. 如果在第二级TLB中命中,则填充到DTLB中,并继续使用新的物理地址。
    2.b. 在DTLB中命中,继续使用物理地址
  3. 在L1中查找,如果未命中 - 查找L2,如果再次未命中则查找L3,如果未命中 - 发送到内存控制器,等待DRAM访问。
  4. 当数据返回时(从任何级别),沿途填充到缓存中(取决于填充策略、缓存包容性和指令时间规范、内存区域类型以及可能的其他因素)。
如果需要进行页面步行,暂停主请求,并根据架构定义向页面映射发出物理负载。在x86中,这可能包括CR3、PDPTR、PDP、PDE、PTE等,具体取决于分页模式、页面大小等。请注意,在虚拟化下,VM上的每个页面步行级别都可能需要在主机上进行完整的页面步行(因此实际上您需要平方所需的步骤数)。
请注意,pagemap基本上是一种树形结构,其中每个访问都取决于先前一个的值(以及您翻译的虚拟地址的一部分)。因此,这些访问是相互依赖的,只有完成最后一个访问后,您才能获得物理地址并返回#3。在此过程中,您想要的行可能会坐在L1中,而您无法知道(尽管老实说,如果您进行了页面步行,则不太可能仍然将该行保留在您的高速缓存中)。

其他重要注意事项 - pagemap 在物理空间中并以此方式访问。您不希望为翻译需要的访问进行翻译,这可能会导致死锁 :)
更重要的是,pagemap 数据可以被缓存,因此尽管由于 TLB 未命中而导致简单的内存访问扩展到多个访问,但页表遍历仍可能相当便宜。


太棒了!我确实查看了Intel架构手册1a,但是里面没有这个图表?你能推荐一些资源吗?还有一件事——你在2.a.b中使用了“STLB”,一开始我以为“S”代表“静态”,然后我看了看我的键盘,它就在字母“D”的旁边。 - undefined
2
@user997112,抱歉,打错了。实际上这里使用的是STLB(S代表Second-level),但在这里它是多余的,我认为没有它会更清晰一些。至于图表,除了这些之外,我不知道还有什么好的。但如果你想要更深入的概述,你应该阅读软件开发者手册。 - undefined

2

是的,正如这里的长篇描述所解释的那样:

http://lwn.net/Articles/252125/

从 CPU 到 L1 再到 L2 和 L3 的过程被用图示表示出来。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接