2012-06-06 113 views
6

我一直在做KVM的东西,并有几个问题无法弄清楚。KVM如何处理中断

1>正如我们所知,通常情况下,外部中断将导致VMexit,并且管理程序将为虚拟中断注入虚拟中断。然后哪个irq将被注入(我的意思是索引guest IDT的中断向量)? KVM如何了解这一点(将主机IRQ与来宾虚拟IRQ相关联)?

2>如果将分配的设备分配给guest虚拟机,管理程序会将该IRQ传递给guest虚拟机。通过跟踪代码,我发现主机IRQ与客户的不同(我的意思是中断向量)。 KVM如何配置客人应使用哪个中断向量?

3>如果我们通过在VMCS中设置某个字段来配置不在外部中断上退出,那么在物理中断过程中会发生什么? CPU会使用来宾IDT作为响应中断吗?如果是这样,KVM是否可以重定向CPU来为guest虚拟机使用另一个IDT(假设修改IDTR)?

4>客人IDT位于哪里?它在初始化vcpu和寄存器(包括IDTR)时由qemu配置?

我真的很希望有人能回复我的问题。我将非常感激。

由于

回答

2

1- 2- 该代码是在irq_comm.c和非常复杂的。对于guest虚拟机矢量,虚拟机监控程序会捕获和监控guest虚拟机的PCI配置空间(实际上这是在QEMU中完成的 - 例如,请参阅kvm_msi_update - 但KVM的系统调用会使用数据更新它)。

3-是的。为了设置另一个IDT,您需要更改VMCS中的IDTR字段。

4-客人IDT由客人代码配置。 QEMU/KVM不直接参与其中。您需要配置执行控制以在LIDT上进行陷阱,以便监控访客IDTR的变化。

听起来像你正试图从ASPLOS'12实施ELI。 离线与我联系(本文的第二作者 - NA)。