5

我正在为 VM 的 IO 进行 KVM 优化。我看过KVM代码,通常所有的物理中断都会导致VMexit进入KVM。然后主机的IDT会处理相应的物理中断。我的问题是 KVM 如何决定是否向来宾注入虚拟中断?在什么情况下它会向来宾注入虚拟中断?

谢谢

4

2 回答 2

3

在 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 中存在页面错误

  • 这会导致 VMEXIT
  • Hypervisor/KVM 处理 VMEXIT
  • 它通过VMCS控制结构查看VMEXIT的原因,发现有缺页。
  • 主机/KVM 负责内存虚拟化,所以它检查是否导致页面错误
    • 因为该页面未分配给 GUEST,在这种情况下,它会调用 HOST 内核中的 alloc_page 并执行 VMENTRY 以恢复 GUEST 执行。
    • 或者映射被 GUEST OS 删除,在这种情况下,KVM 使用 VMCS 控制结构作为通信介质来注入虚拟中断no ​​14,这会导致 GUEST 内核处理页面错误。

这是主机插入虚拟中断的一个示例。当然,还有很多其他方法/理由可以这样做。实际上,您可以配置 VMCS 以使来宾在执行每条指令
后执行 VMEXIT,这可以使用 MONITOR TRAP 标志来完成。

于 2012-06-26T11:01:09.913 回答
1

我猜您指的是分配的设备中断(而不是模拟中断或 virt-IO 中断,它们不直接从物理设备转发到来宾)。对于分配设备的每个 irq,调用 request_threaded_irq 并注册 kvm_assigned_dev_thread 以在每次中断时调用。如您所见,然后调用 kvm_set_irq,并且如上所述,如果中断被屏蔽,则唯一发生的合并。在 x86 中,中断可以被 rflags.if、mov-SS 屏蔽,这是由于 TPR 不允许传递中断或由于具有更高优先级的服务中断。KVM 必须遵循架构定义,以免让客人感到惊讶。

于 2012-06-07T01:14:02.163 回答