CLFLUSH

Flush 缓存行

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
NP 0F AE /7CLFLUSH m8M有效有效含有 m8 的 Flushes 缓存行 。

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

M

  1. modrm.rm escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

说明

将缓存一致性域中缓存层次的每一个级别,包含内存操作数指定线性地址的缓存行无效. 如果该缓存行包含缓存层次中任何级别的修改数据,则该数据会被写回内存. 源操作数是一个字节内存位置.

CLFLUSH的可用性表现为CPUID特征旗CLFLUSH(CPUID.01H:EDX[19])的存在. 受影响的对齐缓存行大小也用CPUID.01H:EBX[15:8]中的值表示.

包含受影响行的页面的内存属性对本指令的行为没有影响. 应当指出的是,处理器可以自由地从系统内存区域以投机方式获取和缓存数据,指定一种内存类型,允许进行投机读取(如WB、WC和WT内存类型)。 PREFETCHh 指令可用于为处理器提供这种投机行为的提示. 由于这种投机性抓取可以随时发生,并且不与指令执行捆绑,CLFLUSH指令没有针对PREFETCHh指令或任何投机性抓取机制(即数据可以在CLFLUSH指令执行之前,期间或执行之后被投机性地加载到缓存行中,引用缓存行)的命令.

命令执行CLFLUSH指示是相互的,命令执行的是写作、锁定的读写指示和栅栏指示。 1 不命令执行CLFLUSHOPT和CLWB。 软件可以使用SFENCE指令命令执行CLFLUSH相对于其中一项操作.

CLFLUSH指令可以在所有特权级别使用,并受与字节负载相关的所有权限检查和断层(此外,CLFLUSH指令允许在只执行部分中冲出线性地址). 像负载一样,CLFLUSH指令设置了页面表格中的A位而不是D位.

在一些执行中,CLFLUSH指令可能总是用交易同步扩展(TSX)导致交易中止. CLFLUSH指令预计不会在典型的交易区域内被普遍使用. 然而,程序员不得依赖CLFLUSH指令强制交易中止,因为他们是否导致交易中止取决于执行.

CLFLUSH指令是用SSE2扩展引入的;然而,由于它有自己的CPUID特征旗,可以在不包括SSE2扩展的IA-32处理器中执行. 另外,通过CPUID指令检测SSE2扩展的存在并不能保证CLFLUSH指令在处理器中得到执行.

CLFLUSH操作在非64位模式和64位模式中是相同的.

行动

Flush_Cache_Line(SRC);

Intel C/C++ 内在编译器

CLFLUSH void _mm_clflush(void const *p);

异常

保护模式
#GP(0)对于非法的内存操作数在CS,DS,ES,FS或GS部分的有效地址.
#SS(0)用于在党卫军部分的一个非法地址. #PF(fault-code) for a 页面错误.
#UD如果 CPUID.01H: EDX.CLFLUSH[19] = 0. 如果使用 LOCK 前缀.
实地址模式
#GP如果操作数的任何部分位于有效地址空间之外,从0到FFFFH.
#UD如果 CPUID.01H: EDX.CLFLUSH[19] = 0. 如果使用 LOCK 前缀.
虚拟 8086 模式
与真实地址模式相同的例外 。
兼容模式
与保护模式中的例外相同.
64 位模式
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址为非冠状形式. #PF(fault-code) for a 页面错误.
#UD如果 CPUID.01H: EDX.CLFLUSH[19] = 0. 如果使用 LOCK 前缀.

来源