如何使TLB与用户进程发生冲突?

ura*_*raj 6 architecture x86-64 tlb

我目前的工作需要在Intel Core系列的CPU上生成指定数量的TLB未命中,尽管进展不顺利。我尝试了很多方法,但是所有方法都具有很高的TLB命中率。有谁知道关于x86 TLB如何工作的有用信息,或在用户进程中生成大量TLB未命中的某些方法?

ugh*_*fhw 6

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

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

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

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

当可用 RAM 变低时,未命中次数将会增加,因为操作系统必须移动更多物理页来满足程序的需求,因此最好同时运行其他占用内存的进程。