我不明白为什么在客人里面会有什么特别的。当外部中断到来时会发生什么。 (假设我们谈论的是在管道上本机运行的来宾代码,而不是根模拟和/或决定延迟重新进入来宾以应对另一个中断。看评论。)
它们不会有效地阻止多条指令的中断;这会损害中断延迟。由于不存在只能在此处传递中断的特殊“同步点”,因此管道需要能够处理任意指令之间的中断。无序执行总是可能会发生很多事情,因此您不能指望在处理中断之前等待任何特定状态;这可能需要很长时间。如果一对指令之间的间隙可以传递中断,为什么其他指令不能呢?
CPU 不会重命名特权级别,因此它们会回滚到退休状态,丢弃后端所有正在执行的指令,然后根据当前状态确定要做什么。也可以看看当中断发生时,流水线中的指令会发生什么情况? https://stackoverflow.com/q/8902132
这个完全未经测试的猜测是基于我对CPU架构的理解。如果对中断延迟有可测量的影响,那可能是真的。
实际上,无论 VT-X 如何,某些指令边界可能无法中断,除非单步执行。
退休带宽为每个时钟 3 (Nehalem),每个逻辑线程每个时钟 4 (Haswell),甚至在 Skylake 中更高。从乱序核心中退出通常是突发性的,因为它是按顺序发生的(以支持精确的异常),这就是为什么我们有一个与保留站分开的 ROB。
一条指令会阻止稍后的独立指令退出一段时间,然后与该指令一起突然退出,这是很常见的。例如缓存未命中加载,或某些独立指令之前的长依赖链的末尾。
因此,对于某些函数或代码块,很可能每次运行时,xor
例如,归零指令总是在与之前的指令相同的周期中退出。这意味着CPU永远不会处于异或清零指令是最旧的非退休指令的状态,因此它和之前的insn之间的间隙永远不会成为中断出现的地方。
如果您有两条紧密相连的指令,例如如果 CPU 从较早的指令返回到用户空间后的一个周期中出现,您可能最终会在 64 字节 I-cache 边界处产生前端效应,从而扰乱廉价独立指令的通常模式,例如nop
or xor
-归零始终在与早期较高延迟指令相同的周期中退出,但仍然可能存在不可干扰的情况,其中获取和 5 宽解码以及 4 宽发出/重命名将可靠地将指令一起放入管道中在准备退出后,没有机会让慢的人先于快的人完成。
正如我所说,这并不是 VT-x 特有的。