4

除了没有将中断传递到虚拟处理器(cli、if=0 等)的某些正常指定条件之外,来宾中的所有指令实际上都是可中断的吗?

也就是说,当传入的硬件中断被提供给 LAPIC,然后被提供给处理器时,据说一些内部魔法恰好将其转换为虚拟中断给来宾(使用虚拟 APIC,不退出)。发生这种情况时,当前执行的指令是否会像典型的中断传递一样立即序列化 OOO 流并跳转到向量,还是 VT-x 的虚拟中断传递会导致发生其他类型的解析?

背景是使用模拟器对竞争条件和同步原语进行压力测试通常非常有价值。人们希望您的仿真器能够在任何指令处接收中断,以触发“有趣的行为”。

这就引出了一个问题,VT-x 虚拟化是否提供了相同的指令级中断粒度,以便像纯指令仿真器一样触发“有趣的行为”?

英特尔 SDM 确实注意到虚拟中断是在指令边界上传递的,但仍然存在一些问题,即芯片上通常有效的所有边界是否始终在 VT-x 模式下检查中断。

4

1 回答 1

2

我看不出有什么理由为什么在客人里面会很特别。当外部中断到达时会发生什么。(假设我们谈论的是在管道上本地运行的来宾代码,而不是根模拟和/或决定延迟重新进入来宾以预期另一个中断。请参阅评论。)

它们不会有效地阻止多条指令的中断;这会损害中断延迟。由于没有特殊的“同步点”只能在那里传递中断,因此流水线需要能够处理任意指令之间的中断。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 边界处出现前端效果,从而扰乱通常的模式廉价的独立指令,如nopor xor-zeroing 总是在与早期的高延迟指令相同的周期中退出,但可能仍然存在不可干扰的情况,其中 fetch 和 5-wide 解码,4-wide issue/rename 将可靠将指令一起输入管道,而没有机会在准备退休后让慢速指令在快速指令之前完成。

正如我所说,这并非特定于 VT-x。

于 2019-02-22T07:23:20.573 回答