代码之家  ›  专栏  ›  技术社区  ›  Jack Humphries

VT-x中的“退出时确认中断”控制导致CPU锁定

  •  2
  • Jack Humphries  · 技术社区  · 7 年前

    我正在编写一个使用“英特尔VT-x虚拟化”的VMM,以支持发布的中断。文档中规定的启用已发布中断的VM入口要求之一是,“退出时确认中断”VM退出控制必须设置为1。

    当我将此控件设置为1时,我的来宾操作系统会运行一段时间,然后停止响应。然后,主机操作系统也停止响应,并将一条消息打印到主机内核日志中,表明运行来宾操作系统的CPU内核经历了硬锁定( NMI watchdog: Watchdog detected hard LOCKUP on cpu 10 ).

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Ross Ridge    7 年前

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

    来自《英特尔64和IA-32体系结构软件开发人员手册》:

    33.2 VMX操作中的中断处理

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

    或者,如果您有很好的理由设置这个位,比如说如果您需要将某些硬件中断路由到来宾,那么您需要调用主机操作系统的中断处理程序,就像它被CPU调用一样。