1

这就是问题:clflush 是否刷新 L1i?英特尔 ISA 手册对此并不清楚:

从高速缓存一致性域中的每一级高速缓存层次结构中,使包含由内存操作数指定的线性地址的高速缓存行无效。如果该高速缓存行在高速缓存层次结构的任何级别包含修改的数据,则该数据将被写回内存

我会根据措辞推测

如果该高速缓存行在高速缓存层次结构的任何级别包含修改的数据,则该数据将被写回内存。

所以L1I保持不变。这是英特尔 CPU 的实际行为吗?

4

1 回答 1

4

clflush做它在锡上所说的并刷新所有缓存:指令,数据和统一。 (以及解码的微指令缓存)。玛格丽特布鲁姆实际测试证实了这一点

指令缓存永远不会是脏的,所以讨论修改的行讨论数据是有道理的。只有回写数据缓存可以是脏的。请注意,其预期目的之一clflush是将脏数据写回非易失性 DIMM,因此文档关注数据是很自然的。

您对措辞的阅读过多,可能是基于一种误解,即回写与刷新同义。 一个干净的高速缓存行(例如 I-cache)可以通过简单的删除来刷新,不需要回写。invd注意和 之间的区别wbinvd。文档使用“ invdflush”作为“invalidate”的同义词。(相关:INVD指令有什么用?


来自英特尔的 vol.2 ISA 参考手册条目clflush

CLFLUSH 指令可用于所有特权级别,并受到所有权限检查和与字节加载相关的错误的影响(此外,允许 CLFLUSH 指令刷新只执行段中的线性地址)。与加载一样,CLFLUSH 指令设置页表中的 A 位但不设置 D 位。

这并没有明确说明它实际上会刷新此类区域中的 I-cache,但它暗示刷新与甚至无法访问数据的情况相关。

半相关:在 x86 中刷新 iCache

于 2020-06-13T14:24:37.907 回答