Architecture 如何使用用户进程导致TLB抖动?

Architecture 如何使用用户进程导致TLB抖动?,architecture,x86-64,tlb,Architecture,X86 64,Tlb,我目前的工作需要在Intel Core系列的CPU上生成指定数量的TLB未命中,但运行不太顺利。我尝试过很多方法,但是它们都有很高的TLB命中率。有人知道关于x86 TLB如何工作的一些有用信息,或者知道在用户进程中生成大量TLB未命中的一些方法吗?TLB是CPU用来记住与虚拟地址关联的物理地址的缓存。虚拟地址空间被分成多个页面,每个页面通常为4KB。TLB为每个可能的虚拟页都有一个空间,其中包含与其关联的物理页的地址。尝试访问物理地址尚未加载的页面时,会发生TLB未命中。因此,要最大化未命中,

我目前的工作需要在Intel Core系列的CPU上生成指定数量的TLB未命中,但运行不太顺利。我尝试过很多方法,但是它们都有很高的TLB命中率。有人知道关于x86 TLB如何工作的一些有用信息,或者知道在用户进程中生成大量TLB未命中的一些方法吗?

TLB是CPU用来记住与虚拟地址关联的物理地址的缓存。虚拟地址空间被分成多个页面,每个页面通常为4KB。TLB为每个可能的虚拟页都有一个空间,其中包含与其关联的物理页的地址。尝试访问物理地址尚未加载的页面时,会发生TLB未命中。因此,要最大化未命中,需要最大化访问的不同页面的数量

不幸的是,事情并非如此简单。简单的TLB未命中将从页表层次结构中读取条目,以找到正确的物理地址。但是,只有当您访问具有物理地址的页面时,才会发生这种情况。操作系统将确定哪些虚拟地址具有哪些物理地址,如果您试图读取任何其他地址,将导致页面错误。页面错误处理程序将终止非法访问该页面的程序,或者移动数据以将物理页面放入该虚拟地址

导致尽可能多的TLB未命中的最佳方法是:

  • 分配操作系统允许的内存量。您应该交替分配大片段和小片段,在分配另一个大片段后释放小片段。这将有望最大化碎片化,将您的内存分散到尽可能多的页面上
  • 从您分配的内存中使用的每个不同页面创建一个包含一个地址的列表。您还可以添加您知道可读的其他页面,例如包含代码的页面
  • 循环浏览此列表,从每页读取数据。由于操作系统需要释放物理页面以放入虚拟页面,因此它将(希望)使用以前与循环中其他页面关联的物理页面,从而导致TLB未命中的最大数量

  • 随着可用RAM的减少,未命中的数量将增加,因为操作系统必须移动更多的物理页面来满足程序的需要,因此最好同时运行其他内存不足的进程。

    感谢您的回复。我知道TLB是如何工作的,我想要的是有关Intel设计的详细信息,例如每个TLB缓存多少个条目以及它使用什么替换算法。通常认为TLB条目将覆盖4KB范围的物理内存,但对于Core Duo P8400和许多其他类型的内存来说,这似乎不是真的。我想知道tlb enry是否可以覆盖超过4KB的phy mem范围。