CLFLUSH - 缓存线清除
操作码 | 指令 | 说明 |
0F AE /7 | CLFLUSH m8 | 清除包含 m8 的缓存线。 |
说明
在处理器缓存层次结构(数据与指令)的所有级别中,使包含源操作数指定的线性地址的缓存线失效。失效会在整个缓存一致性域中传播。如果缓存层次结构中任何级别的缓存线与内存不一致(污损),则在使之失效之前将它写入内存。源操作数是字节内存位置。
CLFLUSH 可用与否取决于 CPUID 功能标志 CLFSH 是否存在(请参阅 CPUID - CPU 标识)。受影响的对齐缓存线大小也使用 CPUID 指令指明。
包含受影响的缓存线的页的内存属性对这条指令的行为没有任何影响。应该注意的是,对于指定为允许推测性读取的内存类型(即 WB、WC 及 WT 内存类型)的系统内存区域,处理器可以随意凭推测从该区域获取与缓存数据。“数据流单指令多数据扩展指令集”PREFETCHh 指令被视作此推测行为的提示。由于此推测性获取随时可能发生,并且与指令执行没有联系,因此确定 CLFLUSH 的顺序时,不考虑 PREFETCHh 或任何推测性获取机制(也就是说,可以凭推测在执行 CLFLUSH 之前、当中或之后将数据加载到缓存线)。
CLFLUSH 的顺序仅根据 MFENCE 指令确定。确定它的顺序时不保证会考虑其它任何边界隔离、序列化或其它 CLFLUSH 指令。例如,软件可以使用 MFENCE 指令确保先前的存储指令都包含在写回中。
CLFLUSH 指令可以在所有的特权级别使用,需要进行所有的权限检查,并可能发生同字节加载关联的所有错误(在仅限执行的段上使用 CLFLUSH 时除外)。与加载一样,CLFLUSH 指令设置页表中的 A 位而不是 D 位。
操作
Flush_Cache_Line(SRC)
英特尔(R) C++ 编译器等价内部函数
CLFLUSH void_mm_clflush(void const *p)
保护模式异常
#GP(0) - CS、DS、ES、FS 或 GS 段中的内存操作数有效地址非法。
#SS(0) - SS 段中的地址非法。
#PF(错误代码) - 页错误。
#UD - 如果 CPUID 功能标志 CLFSH 为 0。
实地址模式异常
中断 13 - 如果操作数的任何部分出现在从 0 到 0FFFFH 的有效地址空间之外。
#UD - 如果 CPUID 功能标志 CLFSH 是 0。如果 CPUID 功能标志 SSE2 是 0。
虚 8086 模式异常
与“实地址模式”中的异常相同。
#PF(错误代码) - 页错误。