除了某些正常的指定条件(中断不会传递给虚拟处理器)(cli,if = 0等)之外,guest虚拟机中的所有指令实际上是否可中断?
这就是说,当将传入的硬件中断分配给LAPIC然后再分配给处理器时,可能发生了一些内部魔术,将其转换为对来宾的虚拟中断(使用虚拟APIC,没有退出)。发生这种情况时,当前执行的指令是否像典型的中断传递一样立即将OOO流序列化并跳转到向量,还是VT-x的虚拟中断传递会导致某种其他类型的解决方案发生?
上下文是,使用模拟器对测试竞争条件和同步原语进行压力测试通常非常有价值。希望您的仿真器能够在任何指令下接收中断,以触发“有趣的行为”。
这引起了一个问题,VT-x虚拟化是否提供相同的指令级中断粒度,以便像纯指令模拟器一样触发“有趣的行为”?
英特尔SDM确实注意到虚拟中断是在指令边界上传递的,但是仍然存在一些问题,即通常在芯片上有效的所有边界是否总是 仍在VT-x模式下检查中断。
答案 0 :(得分:2)
我看不出有什么理由会特别在客人里面。当外部中断到达时会发生什么。 (假设我们正在谈论的是在管道上本地运行的guest虚拟机代码,而不是root仿真和/或决定在再次发生中断之前决定延迟重新进入guest虚拟机。。请参见注释。)< / p>
它们不会有效地阻止多条指令的中断;那会影响中断延迟。由于没有特殊的“同步点”,中断只能在那里传递,因此管道需要能够处理任意指令之间的中断。乱序的exec总是可能发生很多事情,因此您不能指望在处理中断之前等待任何特定的状态。这可能需要太长时间。如果一对指令之间的间隔可以传递一个中断,为什么还没有其他指令呢?
CPU不会重命名特权级别,因此,是的,它们会回退到退休状态,丢弃后端的所有运行中指令,然后根据当前状态确定要做什么。另请参见When an interrupt occurs, what happens to instructions in the pipeline?
这个完全未经测试的猜测是基于我对CPU体系结构的理解。如果对中断延迟有可测量的影响,那可能是真实的事情。
实际上,无论使用VT-X,除非单步执行,否则某些指令边界可能都无法中断。
退休带宽为每个时钟3个(Nehalem),每个逻辑线程每个4个时钟(Haswell),或者在Skylake中甚至更高。从无序核心中退出通常是突发性的,因为它是有序发生的(以支持精确的异常),这就是为什么我们将ROB与预留站分开的原因。
一条指令阻塞一段时间后的独立指令退休,然后与该指令一起突然退休是很常见的。例如缓存未命中负载,或长于dep链的结尾,就在一些独立的指令之前。
因此,对于某些功能或代码块,很有可能每次运行时,例如xor
调零指令总是与之前的指令以相同的周期退出。这意味着CPU永远不会处于异或归零指令是最早的非退休指令的状态,因此它与之前的insn之间的距离永远不会成为出现中断的地方。
如果您有2条彼此紧紧跟随的说明,例如在CPU从较早的指令返回到用户空间之后的一个周期中,您可能最终会在64字节I缓存边界处产生前端效果,从而干扰了廉价的独立指令(如nop
或xor
调零总是在与较早的高延迟指令相同的周期内退出,但是在某些情况下,取回和5宽解码以及4宽发行/重命名将可靠地获得,这仍然是不可扰动的情况指令一起放入管道中,而没有机会在准备退出的慢速操作之前先完成慢速操作。
正如我所说,这不是VT-x特有的。