对于x86架构,KVM为每个虚拟机维护一个pic主中断控制器、一个pic从中断控制器以及一个ioapic控制器(使用pic 加 ioapic 的两种芯片的模拟组合,来控制中断信息),ioapic根据自身维护的重定向表pci irq routing table格式化出一条中断消息,把中断消息发送给local apic(lapic),每个vcpu维护一个lapic控制器,每个vcpu的lapic控制器则模拟了主要的apic寄存器:中断请求寄存器IRR,中断屏蔽寄存器IMR,中断服务寄存器ISR,EOI。同时每个虚拟机有一张中断路由表(kvm_irq_routing_table),chip是一个二维数组,表示三个芯片的各个管脚,每个芯片有24个管脚,每个数组项纪录对应管脚(中断)的gsi号,每个中断都有自己的routing_entry (struct kvm_kernel_irq_routing_entry),routing_entry保存了中断的类型(pci、ioapic、msi)、中断号、以及set触发函数,所有的routing_entry以gsi为索引信息挂接到route_table的map链表里(可能同一个中断号会同时关联pic、ioapic两种中断type)。
对 KVMTOOL 触发的中断,处理大致分三部分:查路由表&#