CPU轮询检查效率低,所以存在中断,正常CPU状态标志寄存器IF(interrupt flag)位为1,那么CPU会去检查是否有中断请求,并找到对应的中断服务程序并执行,完成后返回。
早期x86体系约定,0-31号中断留给处理器自己用,外设的中断从32号开始。
中断注入: 对于外部中断,CPU在每个指令周期结束后,会去检查INTR是否有中断请求。而在Guest模式的CPU,在VM-entry时候会检查VMCS的VM-entry interrupt-information字段。
VM-entry interrupt-information部分格式中断注入是会引入中断延迟的,具体由下面两类情况。
- CPU处于Guest,处理中断就需要VM exit再VM entry。
- vCPU线程睡眠,比如Guest vCPU运行hlt指令时候,就会切换回Host模式,线程挂起。
针对情况一:当Guest CPU收到外部中断的时候会触发VM exit,由Host来处理这次中断,所以KVM可以向目标CPU发送一个IPI中断,触发目标CPU发生一次VM exit。 针对情况二:需要唤醒睡眠的vCPU线程,使其进入CPU就绪队列,准备接受调度。如果宿主系统是一个多处理器系统,那么还需要再向目标CPU发送一个”重新调度“的IPI中断,促使其尽快发生调度,加快被唤醒vCPU线程被调度,执行注入过程。
这里引入了一个kick,当有中断请求时,虚拟中断芯片将主动kick一下CPU,其手段就是IPI。
参考文献
- 《深度探索Linux系统虚拟化:原理与实现》 - 王柏生 & 谢广军
评论区