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