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