gpt4 book ai didi

assembly - 从Intel上的CPUID结果了解TLB

转载 作者:行者123 更新时间:2023-12-02 22:08:08 27 4
gpt4 key购买 nike

我正在探索0x02指令的叶子cpuid,并提出了一些问题。表格in the documentation描述了cpuid结果对TLB配置的含义。他们来了:

情况1

56H TLB Data TLB0: 4 MByte pages, 4-way set associative, 16 entries
[...]
B4H TLB Data TLB1: 4 KByte pages, 4-way associative, 256 entries

这是否意味着只有2个级别的TLB?万一某些x86供应商决定提供3个级别的TLB,如何查询TLB缓存的级别数?

情况2
57H TLB Data TLB0: 4 KByte pages, 4-way associative, 16 entries
[...]
B4H TLB Data TLB1: 4 KByte pages, 4-way associative, 256 entries

这里的“4向关联”只是一个错字,意味着“4向 设置了关联”吗?

情况3
55H TLB Instruction TLB: 2-MByte or 4-MByte pages, fully associative, 7 entries
[...]
6AH Cache uTLB: 4 KByte pages, 8-way set associative, 64 entries
6BH Cache DTLB: 4 KByte pages, 8-way set associative, 256 entries
DTLB代表数据TLB吗? uTLB是什么意思? uops-TLB?这里考虑哪个TLB缓存级别?

情况4
C1H STLB Shared 2nd-Level TLB: 4 KByte/2MByte pages, 8-way associative, 1024 entries

这是否意味着在这种情况下,所有内核之间都共享第二级TLB?因此,如果未明确指定,则TLB缓存核心是否为私有(private)?

最佳答案

How to query the number of levels of TLB cache in case some x86 vendor decides to provide 3 levels of TLB?



叶子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,将有一个或两个数据TLB描述符可以缓存4KB转换。英特尔手册为可缓存数据访问转换的TLB使用以下不同名称:数据TLB,数据TLB0,数据TLB1,DTLB,uTLB和共享的第二层TLB。如果有两个这样的描述符,则级别数为两个。具有更大数量的TLB编号的描述符是用于第二级TLB的描述符。如果只有一个这样的描述符,则级别数为一。
  • 如果存在0xFE,则需要从cpuid叶子0x18获得TLB信息。枚举所有有效子叶,直到最大有效子叶数。如果至少有一个子叶的EDX的至少两个有效位等于11,则TLB级别的数量为2。否则,TLB级别数为1。

  • Ice Lake和Goldmont Plus处理器的TLB信息显示在叶子0x18中。该叶子为编码TLB信息提供了更大的灵活性。叶子0x2中提供了所有其他当前Intel处理器的TLB信息。我不了解Knights Mill(如果有人可以访问Knights Mill,请考虑共享 cpuid转储)。

    确定TLB级别的数量不足以完全描述级别之间的相互关系。当前的英特尔处理器实现两种不同的2级TLB层次结构:
  • 二级TLB可以缓存数据加载(包括预取),数据存储和指令取回的转换。在这种情况下,第二级TLB被称为“共享第二级TLB”。
  • 二级TLB可以缓存数据加载和存储的转换,但不能缓存指令提取。在这种情况下,将使用以下任何一种调用第二级TLB:数据TLB,数据TLB1或DTLB。

  • 我将基于 InstLatx64cpuid转储讨论几个示例。在启用了超线程的 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不相关。

    与英特尔优化手册的表2-17(编号248966-042b)相比,存在一个差异。表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。第二级称为“数据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

    较旧的Intel处理器具有单级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处理器上都可以使用,则还必须考虑这些情况。可以在 here中找到标题为“处理器标识和CPUID指令”的英特尔文档编号241618-025,该文档在第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的最低有效五位不全为零,则子叶有效(即描述TLB结构)。因此,子叶0x0无效。接下来的七个子叶都是有效的,这意味着Ice Lake处理器中有7个TLB描述符。 EDX的最低有效五位指定TLB的类型,接下来的三位指定TLB的级别。通过对子叶位进行解码可以获得以下信息:
  • [SL 01] :描述第一级指令TLB,它是8路完全关联的高速缓存,能够缓存4KB,2MB和4MB页面的翻译。
  • [SL 02] :最低有效5位代表数字5,根据手册的最新版本(第2卷),这是保留的编码。其他位指定了16位完全关联的TLB,并且能够缓存所有页面大小的转换。英特尔已在优化手册的表2-5中提供了有关Ice Lake中TLB的信息。最接近的匹配表明,保留的编码5最有可能代表数据存储转换的第一级TLB。
  • [SL 03] :最低有效5位代表数字4,根据手册的最新版本,该数字也是保留的编码。与表2-5的最接近匹配表明,它代表可缓存4KB转换的数据加载的第一级TLB。方式和集合的数量与表2-5相匹配。
  • [SL 04] :类似于子叶0x3。与表2-5的最接近匹配表明,它代表可缓存2MB和4MB转换的数据加载的第一级TLB。方式和集合的数量与表2-5相匹配。
  • [SL 05] :类似于子叶0x3。与表2-5的最接近匹配表明,它代表可缓存1GB转换的数据加载的第一级TLB。方式和集合的数量与表2-5相匹配。
  • [SL 06] :描述包含8种方式和128组的第二级统一TLB,能够缓存4KB,2MB和4MB页面的翻译。
  • [SL 07] :描述第二级统一TLB,该TLB由8种方式和128组组成,能够缓存4KB和1GB页面的翻译。

  • 表2-5实际上提到只有一个统一的TLB结构,但是一半方法只能缓存4KB,2MB和4MB页面的翻译,另一半只能缓存4KB和1GB页面的翻译。因此,第二级TLB的TLB信息与手册一致。但是,指令TLB的TLB信息与表2-5不一致。该手册可能是正确的。在TLB信息转储中,用于4KB页面的ITLB似乎与用于2MB和4MB页面的ITLB混杂在一起。

    在AMD处理器上,分别在叶子8000_0005和8000_0006中提供了第一级和第二级TLB的TLB信息。有关更多信息,请参见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个条目,可能是完全关联的)。

    Is "4-way associative" here just a typo meaning that "4-way set associative"?



    这不是错字。这些术语是同义词,并且都是常用的。

    Does DTLB stand for Data TLB? What does uTLB mean? uosp-TLB? Which TLB cache level is considered here?



    DTLB和uTLB都是数据TLB的名称。 DTLB名称用于第一级和第二级TLB。 uTLB名称仅用于第一级数据TLB,是Micro-TLB的缩写。

    Does this mean that in that case the 2-nd level TLB is shared among all cores? So when not specified explicitly is the TLB cache core private?



    术语“共享的”在这里是指“统一的”,因为在数据和指令转换中都可以缓存。英特尔应该将其称为UTLB(大写U)或统一TLB,这是现代叶0x18中使用的名称。

    关于assembly - 从Intel上的CPUID结果了解TLB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58128776/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com