INVD

无效的内存

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
0F 08INVDZO有效有效Flush 内部缓存; 启动对外部缓存的冲洗.

实测开销

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

说明

无效化(flushes)处理器的内部缓存,并发布特殊功能总线循环,引导外部缓存也冲走自己. 内部缓存中保存的数据不写回主内存.

执行此指令后, 处理器不会等待外部缓存完成冲洗操作, 然后再执行指令 。 响应缓存冲信号是硬件的责任.

INVD指令是一种特殊指令. 当处理器在 保护模式 运行时,程序或程序的 CPL 必须是 0 执行此指令.

INVD指令在缓存用作临时内存时可以使用,缓存内容需要作废而不是写回内存. 当缓存被用作临时内存时,任何外部设备都不应该积极将数据写入主内存.

谨慎使用此指示. 内部缓存而不写入主内存的数据将丢失. 注意从外部设备到主内存的任何数据(例如通过PCIWrite)都可以暂时存储在缓存中;当INVD指令执行时,这些数据可能会丢失. 除非有特定要求或好处可以冲出缓存而不写回修改后的缓存行(例如,临时内存,测试,或者在缓存与主内存一致性无关的情况下的断层恢复),否则软件应该使用WBINVD指令.

在支持处理器保留内存的处理器上,当处理器保留内存保护启动时,INVD指令无法执行. 见39.5节,"EPC与管理EPC页",Intel(R)64和IA-32架构软件开发者手册,第3D卷.

在支持SEAM的处理器上,INVD指令在SEAM范围保护时无法执行. 见Intel(R)64和IA-32架构软件开发者手册第3卷第35.4节,"记忆保护".

一些处理器在BIOS执行完成后阻止INVD执行. 他们通过将CPUID.07H.01H:EAX[30]列为1来报告这一点. 在这种处理器上,如果 SR BIOS DONE (MSR 地址 151H) 的比特 0 是 1 ,则 INVD 无法执行 。

此指令的操作在非64位模式和64位模式中是相同的.

IA-32 架构兼容性

INVD指令依赖于执行;它可能针对Intel 64或IA-32处理器的不同家族不同执行. 此指令在IA-32处理器上不比Intel486处理器更早得到支持.

行动

Flush(InternalCaches);
SignalFlush(ExternalCaches);
Continue (* Continue execution *)

受影响的旗帜

None.

异常

保护模式
#GP(0)如果当前特权级别不是0. 如果启动处理器保留内存保护。 如果 SEAM 范围被保护。 如果 CPUID.07H.01H: EAX [30] = 1, 比特 0 在 MSR BIOS DONE (MSR 地址 151H) 中设置 。
#UD如果使用 LOCK 前缀 。
实地址模式
#GP(0)如果 CPUID.07H.01H: EAX [30] = 1 和 bit 0 在 MSR BIOS DONE (MSR 地址 151H) 中设置,如果启动处理器保留内存保护,如果 SEAM 范围受到保护.
#UD如果使用 LOCK 前缀 。
虚拟 8086 模式
#GP(0)INVD指令无法在虚拟 8086 模式中执行.
兼容模式
与保护模式中的例外相同.
64 位模式
与保护模式中的例外相同.

来源