当操作系统允许CPU响应中断后,每当执行完一条指令,CPU都将检查中断引脚是否有效,一旦有效,CPU将处理中断,之后回来再继续执行下一条指令。
早期的CPU是有物理连接到中断控制器,中断控制器连接到CPU的INTR引脚,通过电平来告知CPU需要处理中断,CPU会主动检查INTR引脚来确定是否中断。虚拟中断原理相同,对于”虚拟中断“控制器来说,该引脚是一个变量,设置该变量的值,就可以理解为中断芯片有中断请求了。
KVM发现虚拟中断有中断请求时,会向VMCS中VM-entry control部分的VM-entry interruption-information field字段写入中断信息,在切入Guest模式的时候,CPU检查VMCS这个字段,就如同检查CPU的引脚,如果有中断,则进入中断的执行流程。
基于PIC的虚拟中断过程 PIC**只支持单处理器系统**,对于多处理器系统,需要APIC支持。虚拟化也需要模拟APIC。 基于APIC的虚拟中断过程 多核处理器下,每个CPU都需要收发中断,因此,每个CPU需要分别关联一个独立的LAPIC中断芯片;LAPIC需要接受CPU的核间中断IPI,也需要接收来自外设的中断。外设的中断引脚没有直接连接到每个LAPIC上,而是通过一个统一的I/O APIC芯片连接外设,如果一个IO APIC芯片引脚不够,系统中可以使用多个IO APIC。LAPIC和IOAPIC都接到总线上,通过总线进行通讯,所以IOAPIC和LAPIC都需要进行虚拟。Guest模式的CPU和虚拟中断处于两个不同的”世界“,Guest模式的CPU不能够检查虚拟中断芯片引脚,只能在VM-entry时候由KVM代为检查,然后写入VMCS中。所以对于Guest,如果需要中断的注入,那么就需要先VM exit再写入VMCS再回Guest进行处理。
(物理LAPIC设备上一个页面大小的内存用于存储寄存器,APIC Page)Intel在硬件层面对中断虚拟化进行了支持。
- 实现了一个处于Guest模式的APIC页面,称为virtual-APIC page。
- 在Guest模式实现了部分中断芯片逻辑(虚拟中断逻辑),这样在Guest模式下就有了状态和逻辑,就可以模拟很多中断的行为(访问中断寄存器、跟踪中断的状态、向CPU递交中断),这个操作就导致了很多中断不需要VMM介入。但是有些中断还是无法避免需要切换到VMM中(比如通过写ICR寄存器发送IPI,会触发VM exit,由本地LAPIC向目标LAPIC发送IPI)。
在此硬件虚拟化的机制支持下,LAPIC收到中断,主动向处于Guest模式的CPU通知(LAPIC将中断写入posted-interrupt descriptor->LAPIC通过特殊的核间中断posted-interrupt notification通知目标CPU->目标CPU在Guest模式下借助中断逻辑处理中断)。
硬件虚拟化支持下的中断虚拟化过程参考文献
- 《深度探索Linux系统虚拟化:原理与实现》 - 王柏生 & 谢广军
评论区