是否缓存了页表遍历?


12

在具有硬件TLB管理的微处理器(例如Intel x86-64)上,如果发生TLB未命中并且处理器正在页表中,这些(片外)内存访问是否会通过缓存层次结构(L1,L2等)进行访问。 )?


与电子设计无关。问题将结束。
莱昂·海勒

8
它在询问特定芯片的工作原理,所以我认为这是话题。
奥林·拉斯洛普

5
@OlinLathrop:我同意:我认为集成电路的底层细节是很重要的。
davidcary 2011年

我必须同意,如果没有其他问题,调试处理器的功能是获得设计合理的确定性系统的重要一步。这越来越接近我们的界限之一,但在内部似乎很牢固。
Kortuk

Answers:


8

是的,据我所知,在Intel x86-64处理器上,当发生TLB未命中且处理器正在页表中时,这些片外内存访问将通过缓存层次结构进行。

我仍然对某些细节有些模糊,希望其他答案能解决这些问题–是否没有Intel或AMD手册来详细描述页面结构?我的理解是:

  • 首先将某个地址寄存器中的虚拟地址移交给快速TLB以转换为物理地址-PC中的地址移交给L1 ITLB,其他任何寄存器中的地址移交给L1 DTLB 。
  • 如果第一次查找未命中,则尝试另一个更慢,更大的TLB。(此L2 TLB是否也分为ITLB和DTLB,还是统一的TLB缓存?是否还有其他TLB级别-L3或L4?)
  • 如果TLB查找完全失败,并且x86和x86-64 VHPT Walker被禁用,则CPU会发出TLB未命中信号,由OS内核拦截。我的理解是,几乎所有非x86 CPU都做同样的事情-完全在软件中处理TLB遗漏。如果启用,则x86和x86-64处理器具有硬件辅助的VHPT表遍历器,可以处理接下来的几个步骤。(x86和x86-64芯片是否有一个位会完全禁用VHPT,或者是否有很多位可以在某些地址范围内启用VHPT而在其他地址范围内禁用VHPT?这些位在哪里?)
  • 如果TLB查找完全失败,则将原始(可能是用户模式)虚拟地址V1转换为V2,即保存V1物理页号的页表项PTE的虚拟地址。
  • 因为V2再次是虚拟地址,所以CPU会进行正常的虚拟到物理地址转换,只是它跳过L1并直接转到L2。
  • 硬件在从(虚拟索引的)L2高速缓存中获取该PTE的同时,在TLB中查找虚拟地址V2。
  • 因为V2不是指令的地址,所以它不会通过L1指令高速缓存。并且因为V2不是普通用户数据的地址,所以它不会通过L1数据缓存。V2最初被馈送到L2统一缓存(统一指令+数据+ PTE缓存)。请参阅“缓存层次结构示例”
  • 如果L2高速缓存(或L3或任何其他虚拟索引的高速缓存)包含PTE,则VHPT从高速缓存存储器中获取PTE,并将V1的PTE安装在TLB中,并且该PTE中的物理地址用于转换PTE。将原始虚拟地址V1转换为物理RAM地址,最终完全在硬件中获取数据或指令,而无需操作系统的任何帮助。
  • 如果所有级别的虚拟索引高速缓存均失败,但是第二次TLB查找对于V2成功,则VHPT从物理索引高速缓存或主内存中获取PTE,将V1的PTE安装在TLB中,并将物理地址安装在其中PTE用于将原始虚拟地址V1转换为物理RAM地址,最终完全在硬件中获取数据或指令,而无需OS的任何帮助。
  • 如果第二次TLB查找失败,则硬件VHPT遍历器将放弃VHPT TRANSLATION FAULT。
  • 发生VHPT转换故障时,CPU会捕获到OS。操作系统必须找出问题所在并进行修复:
  • (a)也许当前包含V2的页面已换出到磁盘上,因此OS将其读入RAM并重新启动失败的指令,或者
  • (b)可能有错误的程序正在尝试读取或写入或执行某些无效位置,并且操作系统终止了该进程,或者
  • (c)OS编写者使用此机制来捕获各种访问的各种其他技巧–加载包含可能被换出到磁盘的V1的页面;用于调试新程序的各种陷阱;在不直接支持它的CPU上模拟“ W ^ X”;支持写时复制;等等

Thomas W. Barr,Alan L. Cox,Scott Rixner第2页上的图。 在“翻译缓存:跳过,不要走动(页表)” 之间划了一条界限,“ MMU缓存存储的条目”和“ L2数据缓存存储的条目”。(这对于设计新CPU的人可能是有用的论文,这对于“电子设计”来说完全是主题。)

斯蒂芬·埃兰(Stephane Eranian)和大卫·莫斯伯格(David Mosberger) “ IA-64 Linux内核中的虚拟内存” 和Ulrich Drepper。 “每个程序员应该了解的内存知识” (对于编写处理IA-64页表的操作系统的人来说,这可能是有用的论文,这对于ED来说有点不合时宜了-也许堆栈溢出与“操作-系统”标签“ osdev”标签OSDev.org Wiki ,对于该主题而言将是一个更好的地方)。

英特尔第533页上的表A-10。 “”英特尔 ®64 和IA-32体系结构软件开发人员手册“ ” PAGE_WALKS.CYCLES ...可以提示大多数页漫游是否被缓存满足或导致L2缓存未命中。


我喜欢这个答案,但我可能是其中许多人之一,没有足够的专业知识就可以给自己一个应有的赞誉。经其他专家验证,我将提供您已经获得的代表。
Kortuk

我不认为这是正确的。关于TLB查找的项目符号1 + 2是正确的AFAICT,但不是3。在x86(或x86-64)上运行的页表不在软件中处理(有例外情况,请参阅下文),而在硬件中处理。即,当CPU确定无法使用TLB解析地址时,它将自身遍历从CR3寄存器指向的表开始的页表。仅当此解决方案失败时,它才会调用CPU的页面错误处理程序。虚拟化扩展例外,在某些模式下,虚拟机管理程序将解决来宾中发生的页面错误。
Morty 2013年

我认为x86没有办法进行软件TLB更新。允许软TLB处理的ISA对于SW修改TLB条目有特殊的说明,但是我认为x86没有这样做,除了invlpg会使给定的virt addr的任何TLB缓存无效之外。如果HW Pagewalk找不到该虚拟地址的条目,或者条目的权限不允许访问,则会出现#PF异常。操作系统通过更新页表(可能是在从磁盘分页数据或执行写复制后),然后继续进行恢复,以便重新运行有故障的加载/存储并成功执行硬件分页操作来解决此问题。
彼得·科德斯


4

我倾向于同意这属于计算机体系结构stackexchange,而不是电子体系结构stackexchange,但是因为它在这里:

@davidcary是正确的。

一些历史:

英特尔x86页表游程并未一直缓存到P5,也就是奔腾。更准确地说,页表遍历内存访问未缓存,绕过了缓存。由于当时的大多数计算机都是直写的,因此它们接收的值与缓存一致。但是他们没有窥探缓存。

P6,aka Pentium Pro和AFAIK允许所有后续处理器的页表遍历访问缓存,并使用从缓存中提取的值。因此,他们使用回写式缓存。(当然,您可以将页表放在不可缓存的内存中,例如,由MTRR定义。但是,这对性能造成很大的损失,尽管它对于调试OS很有用。)

顺便说一下,此“页表遍历存储器访问可以访问数据缓存”与“页表项可以存储(缓存)在TLB Ttranslation后备缓冲区中”是分开的。在某些计算机上,TLB被称为“翻译缓存”。

另一个相关问题是页表的内部节点可能会缓存在更多类似TLB的数据结构中,例如PDE缓存。

一个主要区别是:数据缓存是连贯的,并且被监听。但是不会监听TLB和PDE缓存,即它们是不连贯的。底线是,由于页表可能缓存在非一致的TLB和PDE高速缓存等中,因此,当页表项可能已经被清除时,软件必须显式刷新单个条目或大容量组(例如整个TLB)。缓存被更改。至少当以“危险”方式更改时,从RW-> R-> I,或更改地址。

我认为可以这样说,每当添加一种新型的非一致性的类似TLB的高速缓存时,某些操作系统就会崩溃,因为它隐式地认为没有这样做。


一个新的补偿。拱。该提案仅在“ 3个月前”开始。我认为有一个较早的版本从来没有超出区域51(没有足够的关注者?)。
保罗·克莱顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.