我正在为 VM 的 IO 进行 KVM 优化。我看过KVM代码,通常所有的物理中断都会导致VMexit进入KVM。然后主机的IDT会处理相应的物理中断。我的问题是 KVM 如何决定是否向来宾注入虚拟中断?在什么情况下它会向来宾注入虚拟中断?
谢谢
在 kvm 的文档中,这是关于何时可以注入虚拟中断的内容。这是链接http://os1a.cs.columbia.edu/lxr/source/Documentation/kvm/api.txt
查看第 905 行
。我认为 struct kvm_run 结构可以控制应用程序如何使 VM 运行.使用cscope并在源代码中搜索字符串request_interrupt_window,您将了解kvm如何查看何时进入guest以注入interupt。另外浏览api.txt文件非常有帮助。
干杯
已编辑
这是主机向来宾注入中断的一个示例。
假设 GUEST VM 中存在页面错误
这是主机插入虚拟中断的一个示例。当然,还有很多其他方法/理由可以这样做。实际上,您可以配置 VMCS 以使来宾在执行每条指令
后执行 VMEXIT,这可以使用 MONITOR TRAP 标志来完成。
我猜您指的是分配的设备中断(而不是模拟中断或 virt-IO 中断,它们不直接从物理设备转发到来宾)。对于分配设备的每个 irq,调用 request_threaded_irq 并注册 kvm_assigned_dev_thread 以在每次中断时调用。如您所见,然后调用 kvm_set_irq,并且如上所述,如果中断被屏蔽,则唯一发生的合并。在 x86 中,中断可以被 rflags.if、mov-SS 屏蔽,这是由于 TPR 不允许传递中断或由于具有更高优先级的服务中断。KVM 必须遵循架构定义,以免让客人感到惊讶。