本页目录
KVM 架构
覆盖: KVM 作为 Linux hypervisor → VMX/SVM 硬件虚拟化 → vCPU 生命周期 → VM exit 处理 → KVM + QEMU 协作模型 → /dev/kvm ioctl API 内核版本: 2.6.20 ~ 6.x
概述
KVM (Kernel-based Virtual Machine) 把 Linux 内核转变为一个 type-1 hypervisor——利用 Intel VMX 或 AMD SVM 硬件虚拟化扩展,让 guest 在 VMX non-root 模式下直接运行在物理 CPU 上。每个 VM 是用户态的一个 QEMU 进程,每个 vCPU 是进程中的一个线程。
架构分层
VM Entry / VM Exit
vCPU 线程模型
// 每个 vCPU = 一个 QEMU 线程, 执行循环:
while
Scheduler 交互
// KVM 通过 preempt notifier 知道 vCPU 何时被抢占:
// → kvm_sched_out(): vCPU 被调度出去了
// → kvm_sched_in(): vCPU 获得了 CPU
// 用于: steal time accounting, TSC 偏移计算
/dev/kvm 接口
// 创建 VM:
int kvm_fd = ;
int vm_fd = ;
// 注册内存 (guest 物理地址空间):
struct kvm_userspace_memory_region region = ;
;
// 创建 vCPU:
int vcpu_fd = ;
// 获取 KVM 版本/能力:
int version = ;
struct kvm_cpuid2 cpuid = ;
;
中断注入
// KVM 将中断注入给 guest:
// 1. 设置 VMCS (VMX) 或 VMCB (SVM) 的中断信息字段
// 2. 设置 interrupt window → VM entry 后 guest 立即响应
// 3. 如果 vCPU 没在跑 (被调度出去) → 设 kick flags
// 中断来源:
// - virtio 设备 (msix)
// - 模拟设备 (8259A PIC, IOAPIC)
// - IPI (guest 内多 vCPU)
// - timer (hrtimer→KVM timer)
参考
- 源码:
virt/kvm/kvm_main.c(核心),arch/x86/kvm/vmx/vmx.c(Intel VMX),arch/x86/kvm/svm/svm.c(AMD SVM) - 内核文档:
Documentation/virt/kvm/ - LWN: "KVM: the Linux virtual machine monitor"
关键词: KVM, VMX, SVM, vCPU, VM exit, VMLAUNCH, VMRESUME, /dev/kvm, KVM_RUN, interrupt injection