首页 > 解决方案 > clflush 是否也会删除 TLB 条目?

问题描述

1是否也刷新关联的 TLB 条目?我假设不会因为以缓存行粒度运行,而 TLB 条目以(更大的)页面粒度存在 - 但我准备好感到惊讶了。clflushclflush


1 ...或者clflushopt尽管人们会合理地假设他们的行为是相同的。

标签: performancecachingx86cpu-cache

解决方案


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

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

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


根据 IACA,clflush在 HSW-SKL 上只有 2 uops,在 NHM-IVB 上只有 4 uops(包括微融合)。所以它甚至没有在英特尔上进行微编码。

IACA 不建模invlpg,但我认为它更多的是 uops。(而且它具有特权,因此测试起来并非完全微不足道。)在 HSW 之前的那些额外的微指令很可能是用于 TLB 失效的。

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


享有特权的事实invlpg是另一个clflush不希望成为它的超集的理由。 clflush是无特权的。据推测,仅出于性能原因,invlpg仅限于环 0。

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

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


在未来的计算中使用非易失性 DIMM,任何未来的 CPU 都不太可能使循环在一定范围内的内存运行变得超慢clflush。您希望大多数使用内存映射 NV 存储的软件都在clflushopt使用clflush.


推荐阅读