虚拟机的中断根据来源 分类 三种
1.硬件中断,来自硬件
2.虚拟中断,来自qemu等用户态应用
3.ipi中断,来自虚拟机中的其他核心
异常 分为 1 种
guest os 中 某些指令的执行也会产生异常, 中断流程 类似于 "ipi中断"
中断流程
1 2 3 三种都要经过
A.中断发生流程
B.guest退出到host hyp2(host PL2)
C.host hyp2 退出到 host PL1
D.host PL1 执行 guest 退出(动作B)的对应处理函数
E.host PL1 执行 中断注入
F.host PL1 陷入 host PL2 并执行 guest entry
1的中断发生流程
很简单的硬件中断产生,然后 Guest OS切回到Host OS
2的中断发生流程为
ioctl(vm_fd,KVM_IRQFD,0)
kvm_vm_ioctl
kvm_irqfd
kvm_irqfd_assign
irqfd_inject
kvm_set_irq/即vgic_irqfd_set_irq
vgic_queue_irq_unlock
kvm_make_request
kvm_vcpu_kick
问题:如果是单核,只能有一个执行流,何来 kick 之说
3的中断发生流程为
调用ipi 指令
Guest OS切回到Host OS
- B.guest退出到host hyp2(host PL2)
硬件行为
guest 进入 host hyp2 后, 进入 host PL2 的异常向量表
在 异常处理函数中, 将
1. host PL2 执行 guest exit
2. 执行 eret 退出到 host PL1
- D.host PL1 执行 guest 退出(动作B)的对应处理函数
kvm_arch_vcpu_ioctl_run 中的循环中
1. guest 退出
2. 处理 guest 退出的原因 : handle_exit
exception_index
ARM_EXCEPTION_IRQ
ARM_EXCEPTION_HVC
[0 ... HSR_EC_MAX] = kvm_handle_unknown_ec,
[HSR_EC_WFI] = kvm_handle_wfx,
[HSR_EC_CP15_32] = kvm_handle_cp15_32,
[HSR_EC_CP15_64] = kvm_handle_cp15_64,
[HSR_EC_CP14_MR] = kvm_handle_cp14_32,
[HSR_EC_CP14_LS] = kvm_handle_cp14_load_store,
[HSR_EC_CP14_64] = kvm_handle_cp14_64,
[HSR_EC_CP_0_13] = kvm_handle_cp_0_13_access,
[HSR_EC_CP10_ID] = kvm_handle_cp10_id,
[HSR_EC_HVC] = handle_hvc,
[HSR_EC_SMC] = handle_smc,
[HSR_EC_IABT] = kvm_handle_guest_abort,
[HSR_EC_DABT] = kvm_handle_guest_abort,
ARM_EXCEPTION_DATA_ABORT
kvm_inject_vabt
ARM_EXCEPTION_HYP_GONE
kvm_vgic_flush_hwstate
vgic_flush_lr_state
vgic_restore_state
- F.host PL1 陷入 host PL2 并执行 guest entry
通过 ioctl(KVM_RUN) 或者 kvm_arch_vcpu_ioctl_run 中的循环