KVM如何处理物理中断?

时间:2012-05-31 01:11:54

标签: interrupt kvm

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

由于

2 个答案:

答案 0 :(得分:3)

在kvm的文档中,这是关于何时可以注入虚拟中断的内容。下面是http://os1a.cs.columbia.edu/lxr/source/Documentation/kvm/api.txt的链接 看第905行。
我认为struct kvm_run结构可以控制应用程序如何创建VM 使用cscope并在源代码中搜索字符串request_interrupt_window,您将了解kvm如何看到何时进入guest虚拟机注入中断。同时通过api.txt文件它非常有用。

干杯

EDITED
这是主持人向客人注入中断的一个例子 假设GUEST VM中存在页面错误

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

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

答案 1 :(得分:1)

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

相关问题