在non-root下收到external-interrupt处理流程

  1. 通常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.

  2. 对于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.

  3. 如果我们通过修改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
    ,这中间还有很多问题需要解决,没有这么简单.

  4. 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

posted @ 2021-02-24 12:58  EwanHai  阅读(404)  评论(0编辑  收藏  举报