TLB、CPUID 和 Hugepages?

TLB, CPUID and Hugepages?

如果我将 64MB 的 2MB 大页面装载到 /mnt/huge2mb,这些页面使用了哪些 TLB 条目?我 mmap()-ed 他们在我的 C 程序中。

cpuid的输出:

   cache and TLB information (2):
      0x63: data TLB: 1G pages, 4-way, 4 entries
      0x03: data TLB: 4K pages, 4-way, 64 entries
      0x76: instruction TLB: 2M/4M pages, fully, 8 entries
      0xff: cache data is in CPUID 4
      0xb6: instruction TLB: 4K, 8-way, 128 entries
      0xf0: 64 byte prefetching
      0xc3: L2 TLB: 4K/2M pages, 6-way, 1536 entries

我相信那些挂载的 2MB 大页面属于数据,所以他们使用数据 TLB 条目。

但是,数据 TLB 条目适用于 1G 和 4K 页面。

那么,那些 2MB 大页面使用了哪些 TLB 条目? L2 TLB条目?如果是,什么是 L2 TLB?它既用于数据又用于指令吗?如果是,那么 4K 数据页存在重叠——数据 TLB 和 L2 TLB。那么 4K 页面额外的 64 个条目的目的是什么?

谢谢!

首先,我不一定会假设来自 CPUID 的数据本身是正确的(多年来存在各种勘误表),如果来自 CPUID 的数据是正确 我不一定会假设 Linux 中的代码正确地解释了它(多年来确定缓存特性已经变得一团糟)。

不知道 CPU 是什么(也无法检查 CPUID 和 Linux 是否正确报告了信息);根据显示的信息,我很想怀疑 0xc3: L2 TLB: 4K/2M pages, 6-way, 1536 entries 用于说明和数据,并将用于您的 2 MiB 页面,但是当使用这 2 MiB 页面时, CPU 也会将 2 MiB TLB 条目拆分为多个部分,并使用 0x03: data TLB: 4K pages, 4-way, 64 entries 用于 2 个 MiB 页面的(4 KiB 部分)。