clflush 1还会刷新关联的TLB条目吗?由于clflush以高速缓存行的粒度运行,而TLB条目以(更大)页面粒度存在,因此我不认为这是可能的,但我准备感到惊讶。



1 ...或clflushopt,尽管可以合理地假设它们的行为相同。

最佳答案

我认为可以安全地拒绝。将invlpg烘焙为clflush听起来像是一个疯狂的设计决定,我认为没有人会做出。您通常希望使页面中的多行无效。也没有明显的好处。刷新TLB并不会更容易实现数据缓存刷新。

即使只是删除最终的TLB条目(不必使任何页面目录缓存无效)也比invlpg弱,但仍然没有意义。

所有现代x86都使用具有物理索引/标记而非虚拟的缓存。 (VIPT L1d缓存实际上是带有索引的自由转换的PIPT,因为它是从页面内偏移量的一部分地址位中获取的。)即使缓存是虚拟的,使TLB条目无效也需要使虚拟缓存无效,而不是相反。 。



根据IACA,在HSW-SKL上,clflush仅为2 oups,而在NHM-IVB上,invlpg仅为4 oups(包括微融合)。因此,它甚至没有在Intel上进行微编码。

IACA没有为invlpg建立模型,但我认为它的作用更大。 (而且它有特权,因此进行测试并非易事。)极有可能在HSW之前的那些额外操作会导致TLB失效。

我没有有关AMD的任何信息。



clflush具有特权的事实是期望clflush不成为其超集的另一个原因。 invlpg没有特权。大概是出于性能原因,invlpg仅限于环0。

但是wbinvd不会出现页面错误,因此用户空间可以使用它来使内核TLB条目无效,从而延迟实时进程和中断处理程序。 (由于类似的原因,clflush被授予特权:它非常慢,我认为不可中断。)clflush确实在非法地址上出错,因此不会打开该拒绝服务漏洞。但是,您可以invlpg共享的VDSO页面。

除非出于某种原因,CPU希望在用户空间中公开clflush(通过将其烘焙到clflush中),否则我真的不明白为什么任何供应商都会这样做。



在未来的计算中使用非易失性DIMM,将来任何CPU都不太可能使其超慢地循环执行clflushopt的一系列内存。您可能希望大多数使用内存映射NV存储的软件都使用clflush,但是我希望CPU供应商也尽可能快地使。

08-16 02:43