2. 虚拟化基础
要理解 KVM 内存虚拟化与 Stage-2 映射,必须先回到虚拟化的整体坐标系:谁在虚拟化谁、Hypervisor 站在什么位置、KVM 在 Linux 内核中扮演什么角色、QEMU 又为什么必须与 KVM 配合。本节把这些基础概念一次讲清,为后续 EPT/Stage-2 页表分析打好地基。
一、虚拟化的分类维度
虚拟化并不是单一技术,而是一组按“抽象对象”和“实现层次”划分的方法集合。常见的分类维度有三类:
- 按抽象对象分:服务器虚拟化、桌面虚拟化、网络虚拟化、存储虚拟化、GPU 虚拟化等。KVM 属于服务器/计算虚拟化,把物理 CPU、内存、中断抽象成 vCPU、Guest 物理内存、虚拟中断。
- 按实现层次分:全虚拟化(Full Virtualization)、半虚拟化(Para-Virtualization)、硬件辅助虚拟化(Hardware-assisted)。KVM 属于硬件辅助全虚拟化,依赖 Intel VT-x/AMD-V 与 EPT/NPT。
- 按 Hypervisor 类型分:Type-1(裸金属)与 Type-2(宿主型)。这是本节重点。
需要特别区分“全虚拟化”和“Type-1/Type-2”:前者描述 Guest 是否需要修改,后者描述 Hypervisor 与硬件、操作系统的相对位置。KVM 常被误认为 Type-2,因为它运行在 Linux 上;但从架构本质看,KVM 是内核模块,Linux 本身充当了 Type-1 的薄层,因此更准确的定位是“Type-1 风格的宿主内核虚拟化”。
二、Type-1 与 Type-2 Hypervisor 对比
Type-1 Hypervisor 直接运行在裸金属上,自身就是最底层软件层,Guest 运行在其上;Type-2 Hypervisor 则作为应用程序运行在通用操作系统之上。两者在性能、延迟、部署方式和适用场景上差异明显。
| 对比项 | Type-1(裸金属) | Type-2(宿主型) |
|---|---|---|
| 运行位置 | 直接位于硬件之上 | 运行在宿主 OS 之上 |
| 典型代表 | VMware ESXi、Xen、Hyper-V | VirtualBox、VMware Workstation、QEMU(纯模拟) |
| 性能开销 | 较低,I/O 路径短 | 较高,需经过宿主 OS 调度 |
| 部署复杂度 | 需独占物理机 | 安装即用,适合开发调试 |
| 典型场景 | 数据中心、云平台 | 桌面开发、教学实验 |
KVM 的特殊性在于:它既不是传统 Type-1 的独立 Hypervisor,也不是纯 Type-2 应用。KVM 以内核模块 kvm.ko 形式加载进 Linux,Linux 内核直接管理硬件,QEMU 作为用户态进程负责设备模拟。因此 KVM 兼具 Type-1 的性能优势与 Linux 生态的灵活性。
三、KVM 架构定位
KVM 的核心思想是“把 Linux 内核变成一个 Hypervisor”。它不重复实现调度、内存管理、电源管理等基础设施,而是复用 Linux 已有能力,只增加虚拟化相关部分:
kvm.ko:提供核心虚拟化框架,管理 vCPU、VM 生命周期。kvm-intel.ko/kvm-amd.ko:对接 Intel VT-x 或 AMD-V 的硬件虚拟化扩展。/dev/kvm:用户态与内核 KVM 交互的字符设备接口。- VMCS(Intel)或 VMCB(AMD):保存 vCPU 的 Guest/Host 状态,是 VM Entry/Exit 的关键数据结构。
当 Guest 执行敏感指令时,CPU 触发 VM Exit,控制权从 Guest 切换到 KVM;KVM 处理后再通过 VM Entry 返回 Guest。内存虚拟化中的 Stage-2 映射,正是在这个切换框架下由硬件 EPT/NPT 完成 GPA 到 HPA 的转换。
四、QEMU 与 KVM 的协作关系
QEMU 是用户态的虚拟机监视器与设备模拟器,KVM 是内核态的加速器。二者分工明确:QEMU 负责“造机器”,KVM 负责“跑 CPU”。
用户态:QEMU 进程
├─ 创建 VM、分配 vCPU 线程
├─ 模拟磁盘、网卡、显卡、USB 等设备
├─ 通过 ioctl(/dev/kvm) 调用 KVM
└─ 处理 MMIO/PIO 退出
内核态:KVM 模块
├─ 创建 VM、vCPU 数据结构
├─ 配置 VMCS/VMCB
├─ 执行 VM Entry / VM Exit
└─ 调用硬件 EPT/NPT 完成 Stage-2 映射
硬件:Intel VT-x + EPT / AMD-V + NPT
典型启动命令如下,-enable-kvm 表示启用 KVM 加速,-cpu host 让 Guest 直接使用宿主 CPU 特性:
qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-smp 4 \
-m 4096 \
-drive file=disk.qcow2,if=virtio \
-netdev user,id=n0 -device virtio-net-pci,netdev=n0 \
-nographic
如果去掉 -enable-kvm,QEMU 会退化为纯软件模拟(TCG),性能下降一个数量级。这也是判断 KVM 是否生效的最直接方式。
ls /dev/kvm 与 kvm-ok,并检查 lsmod | grep kvm 是否加载了 kvm_intel 或 kvm_amd。若 BIOS 未开启 VT-x/AMD-V,/dev/kvm 不会出现。
五、案例场景:一次 Guest 内存访问的完整路径
假设 Guest 中的应用程序访问一个虚拟地址,整个链路如下:
- Guest 内 CR3 指向 Guest 页表,完成 GVA → GPA 转换。
- 若 TLB 未命中,硬件查询 EPT/NPT,完成 GPA → HPA 转换。
- 若 EPT 未命中,触发 EPT Violation,VM Exit 到 KVM。
- KVM 根据 GPA 找到对应 HVA,再查宿主页表得到 HPA,填充 EPT。
- VM Entry 返回 Guest,重新执行访存指令。
这条路径正是后续 Stage-2 映射章节的核心。理解 QEMU 负责 GPA 分配、KVM 负责 EPT 填充、硬件负责两级翻译,才能看懂内存虚拟化的性能瓶颈与优化手段。
六、常见误区与复盘
实际上 KVM 是内核模块,Linux 内核直接管理硬件,QEMU 只是用户态前端,因此 KVM 更接近 Type-1 架构。
误区二:“QEMU 就是 KVM。”
QEMU 是设备模拟器与 VM 管理器,KVM 是 CPU/内存虚拟化加速器,二者是协作关系而非同一组件。
误区三:“有了 KVM 就不需要 QEMU。”
KVM 只提供 vCPU 执行与内存虚拟化接口,设备模拟、镜像管理、迁移控制仍由 QEMU 完成。
复盘本节:虚拟化分类帮助我们定位技术坐标;Type-1/Type-2 对比说明 Hypervisor 的位置差异;KVM 以内核模块形式嵌入 Linux,形成独特的宿主内核虚拟化架构;QEMU 与 KVM 通过 /dev/kvm 与 ioctl 协作,分别承担设备模拟与硬件加速。掌握这四层关系,才能顺利进入 Stage-2 映射的细节分析。