Intel VT-x:如何将 NMI 交付给来宾 OS

Intel VT-x: How NMI is delivered to guest OS

我是 运行 来宾 OS 使用 Intel VT-x 的 KVM。我试图了解在非根模式下 运行 时 NMI 是如何处理的。 Intel VT-x 会自动在客户机上引起 NMI 还是 Linux 内核的 kvm 子系统将 NMI 发送到 VCPU?虽然我已经在guest OS 中注册了一个NMI 处理程序,但我只在非root 执行期间获得一个主机NMI 触发器。

这是对问题的部分回答。我可以描述当 NMI 发生时处理器做了什么,但我不知道 KVM 做了什么。

如果 NMI Exiting control 为 0,并且 NMI 在 VMX-non-root 模式下到达,则 NMI 通过来宾的 IDT 传递给来宾。
如果 NMI Exiting 控件为 1,则 NMI 会导致 VM 退出。 [英特尔 SDM,第 3 卷,第 24.6.1 节,table 24-5]

可能是KVM将这个控件设置为1。在这种情况下,处理器不会自动处理NMI。 VM退出时如何处理,由KVM决定。它可能通过主机 IDT 将 NMI 传递给主机,也可能将其注入客户机。