首页 文章

KVM如何处理物理中断?

提问于
浏览
5

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

谢谢

2 回答

  • 1

    在kvm的文档中,这是关于何时可以注入虚拟中断的内容 . 继承人链接http://os1a.cs.columbia.edu/lxr/source/Documentation/kvm/api.txt
    看看第905行 .
    我认为struct kvm_run结构可以控制应用程序如何使VM运行 . 使用cscope并在源代码中搜索字符串request_interrupt_window,您将了解kvm如何看待何时进入guest虚拟机以注入interupt.Also浏览api.txt文件非常有帮助 .

    干杯

    EDITED
    这是主机将客户端中间注入的一个示例 .
    假设GUEST VM中存在页面错误

    • 这会导致VMEXIT

    • Hypervisor / KVM处理VMEXIT

    • 它通过VMCS控制结构查看VMEXIT的原因并发现存在页面错误 .

    • 主机/ KVM负责内存虚拟化,因此它会检查是否导致页面错误

    • 因为页面没有分配给GUEST,在这种情况下它调用HOST内核中的alloc_page并执行VMENTRY以恢复GUEST执行 .

    • 或GUEST OS删除了映射,在这种情况下,KVM使用VMCS控制结构作为通信介质,导致GUEST内核处理页面错误 .

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

  • 3

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

相关问题