2

我正在观察最后几个英特尔微架构(Nehalem/SB/IB 和 Haswell)。我正在尝试弄清楚发出数据请求时会发生什么(在相当简化的层面上)。到目前为止,我有一个粗略的想法:

  1. 执行引擎发出数据请求
  2. “内存控制”查询 L1 DTLB
  3. 如果以上都未命中,现在查询 L2 TLB

此时可能会发生两件事,未命中或命中:

  1. 如果命中,CPU 会按顺序尝试 L1D/L2/L3 缓存、页表和主内存/硬盘?

  2. 如果它未命中 - CPU 请求(集成内存控制器?)请求检查 RAM 中保存的页表(我在那里得到了正确的 IMC 角色吗?)。

如果有人可以编辑/提供一组要点,这些要点提供 CPU 从执行引擎数据请求中所做的基本“概述”,包括

  • L1 DTLB(数据 TLB)
  • L2 TLB(数据+指令TLB)
  • L1D Cache(数据缓存)
  • 二级缓存(数据+指令缓存)
  • L3缓存(数据+指令缓存)
  • CPU 中控制对主存的访问的部分
  • 页表

将不胜感激。我确实找到了一些有用的图像:

但他们并没有真正分离 TLB 和缓存之间的交互。

更新:我我现在明白了,已经改变了上面的内容。TLB 只是从虚拟地址获取物理地址。如果有遗漏——我们就有麻烦了,需要检查页表。如果有命中,我们只需从 L1D 缓存开始向下遍历内存层次结构。

4

2 回答 2

7

pagemap 仅适用于虚拟到物理地址的转换。但是,由于它驻留在内存中并且仅部分缓存在 TLB 中,因此您可能必须在翻译过程中访问它。

基本流程如下:

  1. 执行计算地址(实际上一些计算,如比例和偏移量可以在内存单元中完成)。
  2. 在 DTLB
    2.a中查找。如果错过,在第 2 级 TLB 中查找。
    2.aa 如果错过 - 开始页面浏览。
    2.ab 如果命中第 2 级 TLB,填入 DTLB 并继续新的物理地址
    2.b。在 DTLB 中被命中,继续物理地址
  3. 查找 L1,如果错过 - 查找 L2,如果错过再次查找 L3,如果错过 - 发送到内存控制器,等待 DRAM 访问。
  4. 当数据返回时(从任何级别),沿途填充缓存(取决于填充策略、缓存包含性和指令时间规范、内存区域类型以及可能的其他因素)。

如果需要 pagewalk,则停止主请求,并向页面映射发出物理负载(根据架构定义)。在 x86 中,它可能包括 CR3、PDPTR、PDP、PDE、PTE 等。取决于分页模式、页面大小等。请注意,在虚拟化下,VM 上的每个页面遍历级别可能需要主机上的完整页面遍历(所以你实际上是所需的步数的平方)。

请注意,页面映射基本上是一个树结构,其中每次访问都取决于前一个的值(以及您转换的虚拟地址的一部分)。因此,这些访问是相互依赖的,只有在最后一个访问完成后,您才能获得物理地址并可以返回到#3。一直以来,您想要的行可能在您不知道的情况下位于您的 L1 中(尽管老实说,如果您进行了 pagewalk,您不太可能仍然在上层缓存中保留该行)。

其他重要注意事项 - 页面映射位于物理空间中并以这种方式访问​​。你不想翻译你需要翻译的访问,这可能是一个死锁:)
更重要的是,页面映射数据可以被缓存,所以虽然一个简单的内存访问可能会由于 TLB 未命中而扩展到多个, pagewalk 可能仍然相当便宜。

于 2014-03-22T23:34:04.177 回答
2

是的,正如这里的详细描述中所解释的:

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

从 CPU 到 L1 到 L2 到 L3 的通道如图所示。

在此处输入图像描述

于 2014-03-23T02:48:53.270 回答