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

时间:2017-12-30 02:04:34

标签: linux x86 virtual-machine virtualization apic

我正在努力支持我使用英特尔VT-x虚拟化编写的VMM中的已发布中断。文档中指定的用于启用发布中断的VM入口要求之一是退出" Acknowledge中断退出" VM退出控制必须设置为1。

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

我正在阅读英特尔文档,并试图仔细思考,但是想知道是否还有其他人知道发生了什么。我现在的一般想法是主机操作系统必须向客户操作系统正在运行的核心发送中断(即我的客户操作系统不参与发送中断),这会导致虚拟机退出。因为我在退出时设置了#34; Acknowledge中断"如果控制为1,则处理器向中断控制器确认接收到中断,并将向量置于VM退出中断信息字段中。此外,由于我目前没有对我的VMM中的中断信息字段做任何事情,因此中断不会被主机操作系统处理,这会导致问题。我正朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:5)

是的,不允许主机OS处理设备中断将是一个问题。而不是在退出时设置"确认中断"控制到一个你应该把它设置为0.然后当你因硬件中断而退出VM时,你应该设置处理器中断启用标志,以允许在主机中正确地确认和服务中断。

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

  

33.2 VMX操作中的中断处理

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

或者,如果您有充分的理由将此位设置为此位,例如,如果您需要将某些硬件中断路由到guest虚拟机,那么您需要调用主机OS的中断处理程序,就好像它已被CPU调用。