在具有硬件TLB管理的微处理器(例如Intel x86-64)上,如果发生TLB未命中并且处理器正在页表中,这些(片外)内存访问是否会通过缓存层次结构(L1,L2等)进行访问。 )?
在具有硬件TLB管理的微处理器(例如Intel x86-64)上,如果发生TLB未命中并且处理器正在页表中,这些(片外)内存访问是否会通过缓存层次结构(L1,L2等)进行访问。 )?
Answers:
是的,据我所知,在Intel x86-64处理器上,当发生TLB未命中且处理器正在页表中时,这些片外内存访问将通过缓存层次结构进行。
我仍然对某些细节有些模糊,希望其他答案能解决这些问题–是否没有Intel或AMD手册来详细描述页面结构?我的理解是:
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缓存未命中。
invlpg
会使给定的virt addr的任何TLB缓存无效之外。如果HW Pagewalk找不到该虚拟地址的条目,或者条目的权限不允许访问,则会出现#PF
异常。操作系统通过更新页表(可能是在从磁盘分页数据或执行写复制后),然后继续进行恢复,以便重新运行有故障的加载/存储并成功执行硬件分页操作来解决此问题。
我倾向于同意这属于计算机体系结构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的高速缓存时,某些操作系统就会崩溃,因为它隐式地认为没有这样做。