在non-root下收到external-interrupt处理流程
-
通常external-interrupt会引起vmexi,如果该external-interrupt就是给Guest的,那么hypervisor就会向Guest注入一个virtual Interrupt,那么哪个irq会被注入呢?(即在Guest IDT indexing的Interrupt vector). KVM怎么知道注入哪个irq?(利用host irq和guest irq一对一定义来实现吗)
对于软件模拟的device和半虚拟化的device, 引起vmexit的physical irq和注入到Guest的virtual irq之间没有直接的一对一定义.
qemu负责模拟虚拟设备,当被模拟的虚拟设备向guest发出中断时,qemu会利用kvm向guest注入一个virtual Interrupt.
不论physical Interrupt是否引起vmexit(在guest-mode arrive的Interrupt会引起,在root-mode arrive的Interrupt不会引起),该physical Interrupt都是由Host的Linux 内核处理的,也就是说,physical Interrupt总是被host consumed.
例如, host中的中断可能会触发一些IO回调函数,或者释放一个由于qemu中的同步IO而阻塞的线程,但是qemu不会将physical interrupt映射到virtual Interrupt.然后,根据qemu模拟虚拟设备的方式,它可能会在设备完成IO操作(例如调用回调函数)后注入virtual interrupt.
-
对于assined到guest的device, hypervisor会将irq deliver给Guest. 通过tracing code, 我发现host的IRQ与Guest的IRQ(guest interrupt vector in IDT)不同, 那么KVM是怎样确定到底需要使用哪个Interrupt vector的呢?
对与device assignment, 这种情况下肯定会有一对一的physical Interrupt和virtual Interrupt,但是他们不需要完全是同一个vector. KVM会对physical Interrupt vector number到virtual Interrupt vector number做一个转换,当physical Interrupt arrived, KVM会向Guest deliver一个vitual Interrupt.
-
如果我们通过修改VMCS的“external-interrupt exiting” flag,使external Interrupt不导致vmexit,那么在physical Interrupt到达的时候会发生什么?CPU会使用guest IDT来回应physical Interrupt吗?如果是这样,KVM能将CPU重定向,使其使用另一个IDT给guest吗?(通过修改IDTR)
可以,这是我们早就开始做的一个研究,研究: ELI: Bare-metal
performance for I/O virtualization,这中间还有很多问题需要解决,没有这么简单. -
guest IDT在哪?guest IDT是由qemu在初始化vcpu和registers期间配置的吗(寄存器包含IDTR吗)?
guest IDT在guest地址空间中, guest IDT由guest自身建立, kvm只是通过硬件IDTR虚拟化出来一个virtual IDTR给guest.
翻译自: https://www.spinics.net/lists/kvm/msg73762.html