我正在努力完全理解 Intel VT-x 中发布的中断处理功能。暂时忽略 VT-d,作为第一步,我只是尝试在单核上的 VMM 中实现基于 CPU 的已发布中断传递。
当 guest 虚拟机与 VMM 运行在同一物理内核上时,当外部中断到达时,会导致 VM 退出。据我了解,管理程序负责设置已发布中断描述符 (PID) PIR 字段中的相应位,并设置未完成通知 (ON) 标志。发布的中断处理应该负责同步 PIR 和 IRR,然后设置 ISR 并自动选择 RVI 以启用虚拟中断传递。
作为中间步骤,我测试了虚拟中断传递,以确保 EOI/PPR 虚拟化按预期工作并且没有问题。如果我手动设置来宾中断状态 VMCS 字段的 RVI,则在执行 VMRESUME 和 EOI 虚拟化工作后,中断将传递给来宾,如 Intel SDM 中所述。我迷失的地方是在虚拟机管理程序线程中运行时触发已发布的中断处理,其中来宾虚拟机退出已经发生。
SDM 第 31.6 章这样说:
如果“外部中断退出”VM 执行控制为 1,则任何未屏蔽的外部中断都会导致 VM 退出(请参见第 27.2 节)。如果“处理发布的中断”VM 执行控制也为 1,则此行为会更改,处理器将按如下方式处理外部中断:
- 本地APIC得到认可;这为处理器核心提供了一个中断向量,此处称为物理向量。
- 如果物理向量等于中断后通知向量,则逻辑处理器继续下一步。否则,VM 会像正常情况一样因外部中断而退出;该向量保存在VM退出中断信息字段中。
第2点似乎是关键。在我描述的场景中,外部中断已经导致虚拟机从虚拟机退出,我想通过发布的中断处理为其注入中断。我对通知向量的理解是,它的目的是向远程 vcore 发出信号,告知其 PID->PIR 中可能存在挂起的中断,以便在不导致 VM 退出的情况下理想地处理这些中断。但就我而言,所有内容都在同一核心上运行,并且虚拟机退出已经发生。所以我想有了所有这些背景,我的主要问题是:
到目前为止,在我的尝试中,很明显,VM 条目本身不会触发发布的中断处理 - 也就是说,尽管 PID 在 VM 退出期间已更新以设置 PIR 和 ON 位,但我看不到任何变化虚拟 APIC IRR/ISR - 中断不会传递给客户机。我觉得关于 NV 有一些基本的东西我仍然不理解。任何帮助将不胜感激。
编辑: 或者也许我的误解更加基本:发布的中断处理是否旨在“专门”处理到远程核心的中断发布?如果所有内容都在同一个物理核心上运行,也许发布的中断处理是无关紧要的,我可以/应该做的就是直接在 VMM 软件中设置 RVI?
SDM 中的发布中断处理部分(第 3 卷,31.6)描述了当接收到与发布中断通知向量匹配的外部中断时 CPU 执行的步骤。
如果您不使用 IOMMU 生成通知中断,那么您需要在软件中模拟该行为。
模拟完中断发布处理的步骤后,您就可以触发虚拟中断的传递,如 31.2 中所述。这部分很简单:如果虚拟中断传递执行控制为 1,VM 进入会导致对挂起的虚拟中断进行评估。