这是一个问题:clflush会冲洗L1i吗?英特尔ISA手册对此没有明确说明:
从缓存中缓存层次结构的每个级别失效 相干域 包含线性地址的缓存行 使用内存操作数指定。如果该缓存行包含 在缓存层次结构的任何级别修改的数据,该数据是 写回内存
我会通过措辞推测
如果该缓存行包含任何级别的修改数据缓存层次结构,该数据将写回内存。
所以L1I原封不动。是英特尔 CPU 的实际行为吗?
clflush
按照它在 tin 上所说的去做,并刷新所有缓存:指令、数据和统一。(以及解码后的 uop 缓存(。 玛格丽特·布鲁姆(Margaret Bloom(实际上进行了测试以证实这一点。
指令缓存永远不会脏,因此讨论修改后的行讨论数据是有道理的。 只有回写数据缓存可以是脏的。请注意,clflush
的预期目的之一是将脏数据写回非易失性 DIMM,因此文档关注数据是很自然的。
你对措辞读得太多了,也许是基于一种误解,即回写是刷新的同义词。干净的缓存行(例如 I-cache(可以通过简单地删除它来刷新,无需写回。请注意invd
和wbinvd
之间的区别。invd
文档使用"刷新"作为"无效"的同义词。 (相关:INVD指令有什么用?
来自英特尔的第 2 卷 ISA 参考手册条目clflush
可以在所有权限级别使用,并且受所有权限检查和与字节加载相关的错误(此外,允许 CLFLUSH 指令刷新仅执行段中的线性地址(。与加载一样,CLFLUSH 指令在页表中设置 A 位,但不设置 D 位。
这并没有明确说明它实际上在这些区域中刷新了 I-cache,但它暗示刷新与甚至无法访问数据的情况相关。
半相关:在x86中刷新iCache