Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TLB、CPUID和Hugepages?_C_Linux_Huge Pages - Fatal编程技术网

TLB、CPUID和Hugepages?

TLB、CPUID和Hugepages?,c,linux,huge-pages,C,Linux,Huge Pages,如果我将64MB的2MB hugepages装载到/mnt/huge2mb,这些页面使用哪些TLB条目?我mmap()-在我的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

如果我将64MB的2MB hugepages装载到/mnt/huge2mb,这些页面使用哪些TLB条目?我
mmap()
-在我的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 hugepages属于数据,因此它们使用数据TLB条目

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

那么,这些2MB hugepages使用了哪些TLB条目?L2 TLB条目?如果是,什么是L2 TLB?它是用于数据和指令的吗?如果是,则数据的4K页面存在重叠——数据TLB和L2 TLB。那么,为4K页面增加64个条目的目的是什么


谢谢

首先,我不一定认为来自CPUID的数据本身是正确的(多年来有各种各样的勘误表),如果来自CPUID的数据是正确的,我也不一定认为Linux中的代码正确地解释了它(多年来,确定缓存特性变得一团糟)


不知道CPU是什么(也不能够检查CPUID和Linux是否正确报告了信息);根据显示的信息,我可能会怀疑
0xc3:L2 TLB:4K/2M页,6路,1536个条目
用于指令和数据,并将用于您的2个MiB页,但当使用这2个MiB页时,CPU也会将2个MiB TLB条目拆分为多个条目,并使用
0x03:data TLB:4K页,4路,2个MiB页面的64个条目

感谢您的回复。由于CPUID的输出可能不可靠(因为CPUID让其他人提交错误输出的错误),我在哪里可以找到有关Intel Xeon Skylake CPU的可靠信息?我在Intel.com上看不到它。您提到的
CPU还将把2个MiB TLB条目分割成若干段,并对2个MiB页面(4个KiB)使用0x03:data TLB:4K页面、4路、64个条目。
。有关于它的文件吗?我很好奇,如果L2 TLB已经有了条目,CPU为什么会这样做。如果4K页数据TLB类似于L2 TLB的回退。那么,它如何翻译/查找指向2MIB页面中间的某处的虚拟内存地址?关于Skylake的信息,也许这个站点可以帮助:讽刺的是(幸运的是?)该页面提到“注意:CPUID leaf 2(EAX=02H)错误地将STLB报告为“6路”。Skylake erratum SKL148建议软件忽略该值”,因此来自Linux的
0xc3:L2 TLB:4K/2M页,6路,1536条输入项可能无法解释该CPUID错误(应该说
0xc3:L2 TLB:4K/2M页,12路,1536条条目
)。我不确定是否有/没有任何关于“2 MiB TLB拆分”的文档——这是一个“非体系结构实现细节”(换句话说,它应该对软件是透明的,因此不需要真正的文档记录)。一般来说,L2的意思是“更大但更慢”,因此,出于性能原因,您希望将其引入L1(更小的错误更快)(如果L1数据TLB仅支持4KIB,那么不拆分就无法工作)。如果我的猜测是正确的,对于TLB查找,CPU将检查L1数据TLB(
0x03:data TLB:4K页,4路,64个条目
),如果不支持,则检查L2 TLB(
0xc3:L2 TLB:4K/2M页,12路,1536个条目
)。如果它也不在那里,那么CPU将沿着“TLB未命中”路径(从内存中获取TLB),然后将它带到L2 TLB,然后带到L1 TLB。如果它在L2 TLB中(但不在L1 TLB中),那么它只会将细节从L2 TLB传输到L1 TLB(包括使用“2MIB页的开始”和“我们实际需要的4KIB在2MIB内的偏移量”计算地址)