2

我正在努力支持我正在编写的使用 Intel VT-x 虚拟化的 VMM 中的已发布中断。启用发布中断的文档中指定的 VM 进入要求之一是“退出时确认中断”VM 退出控件必须设置为 1。

当我将此控件设置为 1 时,我的客户操作系统会在停止响应之前运行一小段时间。然后,主机操作系统也停止响应,并在主机内核日志中打印一条消息,指出运行来宾操作系统的 CPU 内核发生了硬锁定 ( NMI watchdog: Watchdog detected hard LOCKUP on cpu 10)。

我正在阅读英特尔文档并试图思考这个问题,但想知道是否有其他人知道发生了什么。我现在的一般想法是,主机操作系统必须向当前正在运行来宾操作系统的内核发送中断(即我的来宾操作系统不参与发送中断),这会导致 VM 退出。由于我将“退出时确认中断”控件设置为 1,因此处理器向中断控制器确认已收到中断,并将向量放入 VM 退出中断信息字段中。此外,由于目前我没有对 VMM 中的中断信息字段执行任何操作,因此主机操作系统不会处理中断,这会导致问题。我是否朝着正确的方向前进?

4

1 回答 1

4

是的,不允许主机操作系统处理设备中断将是一个问题。与其将“退出时确认中断”控制设置为 1,不如将其设置为 0。然后,当您因硬件中断而退出 VM 时,您应该设置处理器中断启用标志以允许确认和服务中断通常在主机。

来自英特尔 64 和 IA-32 架构软件开发人员手册:

33.2 VMX 操作中的中断处理

  • 退出时确认中断。控制 VMCS 中的“退出时确认中断”VM 退出控制控制外部中断确认的处理器行为。如果控制为1,则处理器在VM退出时确认中断控制器获取中断向量,并将向量存储在VM-exit中断信息字段中。如果 control 为 0,则在 VM 退出期间不确认外部中断。由于外部中断导致 VM 退出时 RFLAGS.IF 自动清除,VMM 重新启用中断(设置 RFLAGS.IF = 1)通过监视器/主机 IDT 启动外部中断确认和外部中断向量

或者,如果您有充分的理由设置此位,例如您需要将某些硬件中断路由到客户机,那么您需要调用主机操作系统的中断处理程序,就好像它已被 CPU 调用一样。

于 2017-12-30T03:07:29.970 回答