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供应商也尽可能快地使。