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-VVirtualBox、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 是否生效的最直接方式。

判断 KVM 是否可用:执行 ls /dev/kvm 与 kvm-ok,并检查 lsmod | grep kvm 是否加载了 kvm_intel 或 kvm_amd。若 BIOS 未开启 VT-x/AMD-V,/dev/kvm 不会出现。

五、案例场景:一次 Guest 内存访问的完整路径

假设 Guest 中的应用程序访问一个虚拟地址,整个链路如下:

  1. Guest 内 CR3 指向 Guest 页表,完成 GVA → GPA 转换。
  2. 若 TLB 未命中,硬件查询 EPT/NPT,完成 GPA → HPA 转换。
  3. 若 EPT 未命中,触发 EPT Violation,VM Exit 到 KVM。
  4. KVM 根据 GPA 找到对应 HVA,再查宿主页表得到 HPA,填充 EPT。
  5. VM Entry 返回 Guest,重新执行访存指令。

这条路径正是后续 Stage-2 映射章节的核心。理解 QEMU 负责 GPA 分配、KVM 负责 EPT 填充、硬件负责两级翻译,才能看懂内存虚拟化的性能瓶颈与优化手段。

六、常见误区与复盘

误区一:“KVM 是 Type-2,因为它跑在 Linux 上。”
实际上 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 映射的细节分析。

KVM 架构定位与 QEMU 协作关系 用户态(User Space) QEMU 进程 设备模拟 / VM 管理 vCPU 线程 KVM_RUN ioctl /dev/kvm 用户态与内核接口 内核态(Kernel Space)— Linux + KVM kvm.ko VM / vCPU 管理 VM Entry / Exit kvm-intel / kvm-amd VMCS / VMCB 配置 EPT Violation 处理 Linux 内存管理 HVA → HPA 映射 页表 / 反向映射 硬件层(Hardware) Intel VT-x + EPT AMD-V + NPT 物理 CPU / 内存 ioctl(KVM_RUN) VM Entry VM Exit 访存路径:GVA → Guest 页表 → GPA → EPT/NPT → HPA(未命中则 EPT Violation → KVM 填充 → VM Entry 重试)