在某些x86厂商的情况下如何查询TLB缓存的级别数
决定提供 3 级 TLB?
Leaf 0x2 可能仅在 Intel 处理器上返回 TLB 信息。它保留在所有当前的 AMD 处理器上。在所有当前的 Intel 处理器上,没有一个数字可以告诉您 TLB 级别的数量。确定级别数的唯一方法是枚举所有与 TLB 相关的cpuid 叶或子叶。以下算法适用于所有当前支持 cpuid 指令的 Intel 处理器(包括 Ice Lake、Goldmont Plus 和 Knights Mill):
- 检查在 EAX 设置为叶 0x2 的情况下执行
cpuid 时返回的四个寄存器 EAX、EBX、ECX 和 EDX 中的任何一个中是否存在值 0xFE。
- 如果 0xFE 不存在,枚举四个寄存器中的所有字节。根据 Intel 手册第 2 卷(编号 325383-070US)的表 3-12,将有一个或两个可以缓存 4KB 翻译的数据 TLB 描述符。英特尔手册对可能缓存数据访问转换的 TLB 使用了以下不同名称:Data TLB、Data TLB0、Data TLB1、DTLB、uTLB 和 Shared 2nd-Level TLB。如果有两个这样的描述符,那么级别数是两个。 TLB 号数较多的描述符是二级TLB 的描述符。如果只有一个这样的描述符,则级别数为 1。
- 如果0xFE存在,则需要从
cpuidleaf 0x18获取TLB信息。枚举所有有效子叶,直到最大有效子叶数。如果至少有一个子叶,其 EDX 的最低两位有效位等于 11,则 TLB 级数为 2。否则,TLB 级数为 1。
Ice Lake 和 Goldmont Plus 处理器的 TLB 信息存在于叶 0x18 中。该叶子在编码 TLB 信息方面提供了更大的灵活性。所有其他当前 Intel 处理器的 TLB 信息都存在于叶 0x2 中。我不知道 Knights Mill(如果有人可以访问 Knights Mill,请考虑分享 cpuid 转储)。
确定 TLB 级别的数量不足以完全描述级别之间的关系。当前的英特尔处理器实现了两种不同的 2 级 TLB 层次结构:
- 二级 TLB 可以缓存数据加载(包括预取)、数据存储和指令提取的转换。在这种情况下,二级 TLB 称为“共享二级 TLB”。
- 二级 TLB 可以缓存数据加载和存储的转换,但不能缓存指令提取。在这种情况下,二级 TLB 被称为以下任何一种:Data TLB、Data TLB1 或 DTLB。
我将讨论几个基于来自InstLatx64 的cpuid 转储的示例。在启用超线程的 Haswell 处理器之一上,叶子 0x2 在四个寄存器中提供以下信息:
76036301-00F0B5FF-00000000-00C10000
没有 0xFE,所以 TLB 信息存在于这个叶子本身中。根据表3-12:
76: Instruction TLB: 2M/4M pages, fully associative, 8 entries
03: Data TLB: 4 KByte pages, 4-way set associative, 64 entries
63: Data TLB: 2 MByte or 4 MByte pages, 4-way set associative, 32 entries and a separate array with 1 GByte pages, 4-way set associative, 4 entries
B5: Instruction TLB: 4KByte pages, 8-way set associative, 64 entries
C1: Shared 2nd-Level TLB: 4 KByte/2MByte pages, 8-way associative, 1024 entries
其他字节与 TLB 无关。
与英特尔优化手册(编号 248966-042b)的表 2-17 相比存在一处差异。表 2-17 提到了 4KB 条目的指令 TLB 有 128 个条目,4 路关联,并且在两个超线程之间动态分区。但是 TLB 转储说它是 8 路关联的,只有 64 个条目。 128 个条目的 4 路 ITLB 实际上没有编码,所以我认为手册是错误的。反正C1显示有两层TLB,第二层缓存数据和指令翻译。
在 Goldmont 处理器之一上,叶子 0x2 在四个寄存器中提供以下信息:
6164A001-0000FFC4-00000000-00000000
这里是TLB相关字节的解释:
61: Instruction TLB: 4 KByte pages, fully associative, 48 entries
64: Data TLB: 4 KByte pages, 4-way set associative, 512 entries
A0: DTLB: 4k pages, fully associative, 32 entries
C4: DTLB: 2M/4M Byte pages, 4-way associative, 32 entries
4KB 页面有两个数据 TLB,一个有 512 个条目,另一个有 32 个条目。这意味着处理器有两个级别的 TLB。第二层称为“Data TLB”,因此只能缓存数据翻译。
优化手册的表 19-4 提到 Goldmont 中的 ITLB 支持大页面,但 TLB 信息中不存在此信息。数据TLB信息与手册表19-7一致,只是手册中将“数据TLB”和“DTLB”分别称为“DTLB”和“uTLB”。
在 Knights Landing 处理器之一上,叶子 0x2 在四个寄存器中提供以下信息:
6C6B6A01-00FF616D-00000000-00000000
6C: DTLB: 2M/4M pages, 8-way set associative, 128 entries
6B: DTLB: 4 KByte pages, 8-way set associative, 256 entries
6A: uTLB: 4 KByte pages, 8-way set associative, 64 entries
61: Instruction TLB: 4 KByte pages, fully associative, 48 entries
6D: DTLB: 1 GByte pages, fully associative, 16 entries
所以有两个 TLB 级别。第一个由不同页面大小的多个结构组成。 4KB 页面的 TLB 称为 uTLB,其他页面大小的 TLB 称为 DTLB。第二级TLB称为DTLB。这些数字和名称与手册中的表 20-3 一致。
Silvermont 处理器提供以下 TLB 信息:
61B3A001-0000FFC2-00000000-00000000
61: Instruction TLB: 4 KByte pages, fully associative, 48 entries
B3: Data TLB: 4 KByte pages, 4-way set associative, 128 entries
A0: DTLB: 4k pages, fully associative, 32 entries
C2: DTLB: 4 KByte/2 MByte pages, 4-way associative, 16 entries
此信息与手册一致,C2除外。我认为应该说“4 MByte/2 MByte”而不是“4 KByte/2 MByte”。这可能是手册中的错字。
英特尔 Penryn 微架构是一个示例,其中 TLB 信息使用名称 TLB0 和 TLB1 来指代第一级和第二级 TLB:
05: Data TLB1: 4 MByte pages, 4-way set associative, 32 entries
B0: Instruction TLB: 4 KByte pages, 4-way set associative, 128 entries
B1: Instruction TLB: 2M pages, 4-way, 8 entries or 4M pages, 4-way, 4 entries
56: Data TLB0: 4 MByte pages, 4-way set associative, 16 entries
57: Data TLB0: 4 KByte pages, 4-way associative, 16 entries
B4: Data TLB1: 4 KByte pages, 4-way associative, 256 entries
较旧的英特尔处理器具有单级 TLB 层次结构。例如,这里是 Prescott 的 TLB 信息:
5B: Data TLB: 4 KByte and 4 MByte pages, 64 entries
50: Instruction TLB: 4 KByte and 2-MByte or 4-MByte pages, 64 entries
所有 Intel 80386 处理器和部分 Intel 80486 处理器都包含单级 TLB 层次结构,但不支持 cpuid 指令。在 80386 之前的处理器上,没有分页。如果您希望上述算法适用于所有 Intel x86 处理器,您还必须考虑这些情况。英特尔文档编号 241618-025 标题为“处理器标识和 CPUID 指令”,可在here 找到,在第 7 章中讨论了如何处理这些情况。
我将讨论一个示例,其中 TLB 信息存在于叶 0x18 而不是叶 0x2 中。就像我之前所说的那样,现有的英特尔处理器中唯一在 0x18 中存在 TLB 信息的是 Ice Lake 和 Goldmont Plus 处理器(可能还有 Knights Mill)。 Ice Lake 处理器的叶子 0x2 转储是:
00FEFF01-000000F0-00000000-00000000
有一个 0xFE 字节,因此 TLB 信息存在于更强大的叶子 0x18 中。叶 0x18 的子叶 0x0 指定最大有效子叶为 0x7。以下是子叶 0x0 到 0x7 的转储:
00000007-00000000-00000000-00000000 [SL 00]
00000000-00080007-00000001-00004122 [SL 01]
00000000-0010000F-00000001-00004125 [SL 02]
00000000-00040001-00000010-00004024 [SL 03]
00000000-00040006-00000008-00004024 [SL 04]
00000000-00080008-00000001-00004124 [SL 05]
00000000-00080007-00000080-00004043 [SL 06]
00000000-00080009-00000080-00004043 [SL 07]
英特尔手册描述了如何解码这些位。每个有效的子叶都描述了一个 TLB 结构。如果 EDX 的最低 5 位不全为零,则子叶是有效的(即描述 TLB 结构)。因此,子叶 0x0 无效。接下来的七个子叶都是有效的,这意味着一个 Ice Lake 处理器中有 7 个 TLB 描述符。 EDX 的最低 5 位指定 TLB 的类型,接下来的 3 位指定 TLB 的级别。通过对子叶位进行解码得到以下信息:
-
[SL 01]:描述一级指令 TLB,它是一个 8 路完全关联缓存,能够缓存 4KB、2MB 和 4MB 页面的翻译。
-
[SL 02]:最低有效五位表示数字 5,根据最新版本的手册(第 2 卷),这是保留的编码。其他位指定一个 TLB,它是 16 路完全关联的,并且能够缓存所有页面大小的翻译。 Intel 在优化手册的表 2-5 中提供了有关 Ice Lake 中 TLB 的信息。最接近的匹配表明保留编码 5 最有可能代表用于数据存储转换的第一级 TLB。
-
[SL 03]:最低有效五位代表数字 4,根据最新版本的手册,这也是保留的编码。与表 2-5 最接近的匹配表明它代表了可以缓存 4KB 转换的数据加载的第一级 TLB。路数和集数与表 2-5 相符。
-
[SL 04]:类似于 subleaf 0x3。与表 2-5 最接近的匹配表明它代表了用于数据加载的第一级 TLB,可以缓存 2MB 和 4MB 的翻译。路数和集数与表 2-5 相符。
-
[SL 05]:类似于 subleaf 0x3。与表 2-5 最接近的匹配表明它代表了可以缓存 1GB 转换的数据加载的第一级 TLB。路数和集数与表 2-5 相符。
-
[SL 06]:描述了由8路128组组成的二级统一TLB,能够缓存4KB、2MB和4MB页面的翻译。
-
[SL 07]:描述由8路128组组成的二级统一TLB,能够缓存4KB和1GB页面的翻译。
表 2-5 实际上提到了统一的 TLB 结构只有一种,但一半的方式只能缓存 4KB、2MB 和 4MB 页面的翻译,另一半只能缓存 4KB 和 1GB 页面的翻译。所以二级TLB的TLB信息与手册一致。但是,TLB指令的TLB信息与表2-5不一致。手册可能是正确的。在 TLB 信息转储中,4KB 页面的 ITLB 似乎与 2MB 和 4MB 页面的 ITLB 混淆了。
在 AMD 处理器上,第一级和第二级 TLB 的 TLB 信息分别在叶 8000_0005 和 8000_0006 中提供。更多信息可以在 AMD 手册第 3 卷中找到。早于 K5 的 AMD 处理器不支持cpuid,其中一些处理器包括单级 TLB。因此,如果您关心这些处理器,则需要一种替代机制来确定 TLB 是否存在。 Zen 2 在两个 TLB 级别都增加了 1GB 支持。有关这些 TLB 的信息可以在叶子 8000_0019 中找到。
AMD Zen 具有三级指令 TLB 层次结构according to AMD。这是我所知道的第一个使用三层 TLB 层次结构的核心微架构。 AMD Zen+ 和 AMD Zen 2 很可能也是这种情况(但我找不到证实这一点的 AMD 消息来源)。 L0 ITLB 上似乎没有记录在案的cpuid 信息。因此,您可能必须检查处理器是 AMD Zen 还是更高版本,并为这些处理器手动提供 L0 ITLB 信息(所有页面大小的 8 个条目,可能是完全关联的)。
这里的“4-way associative”只是一个错字,意思是“4-way set
联想”?
这不是错字。这些术语是同义词,并且都是常用的。
DTLB 代表数据 TLB 吗? uTLB 是什么意思? uosp-TLB?哪个 TLB
这里考虑缓存级别?
DTLB 和 uTLB 都是数据 TLB 的名称。 DTLB 名称用于一级和二级TLB。 uTLB名称仅用于一级数据TLB,是micro-TLB的简称。
这是否意味着在这种情况下,第 2 级 TLB 在
所有核心?所以当没有明确指定是TLB缓存核心
私人的?
这里的“共享”一词意味着“统一”,因为数据和指令的翻译都可以被缓存。英特尔应该将其称为 UTLB(大写 U)或 Unified TLB,这是现代叶子 0x18 中使用的名称。