C语言 TLB, CPUID and Hugepages?



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

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 片段(。

最新更新