KVM(Kernel-based Virtual Machine)本质是Linux 内核模块 + 用户态工具的完整虚拟化栈,核心组件分为内核层、用户态层、硬件辅助层三大部分。
内核核心组件(KVM 本体)
这些是 Linux 内核里的模块,提供底层虚拟化能力:
kvm.ko,KVM 核心框架模块,负责虚拟机管理、VCpu 调度、内存虚拟化、中断注入等通用虚拟化逻辑。
kvm-intel.ko / kvm-amd.ko,硬件架构相关模块:
- Intel:依赖VT-x技术
- AMD:依赖AMD-V技术提供 CPU 硬件虚拟化指令集支持,实现 Guest 与 Host 隔离。
kvmgt.ko(可选),Intel GVT-g 显卡虚拟化相关,用于 GPU 直通 / 虚拟化。
用户态核心组件
KVM 本身只做 CPU / 内存虚拟化,I/O 与设备模拟靠 QEMU:
QEMU-KVM,最核心用户态组件,负责:
- 模拟各种虚拟硬件(网卡、磁盘、显卡、BIOS/UEFI)
- 处理虚拟机 I/O 请求
- 与内核 kvm.ko 交互,启动 / 管理虚拟机
libvirt & libvirtd,虚拟化管理库与守护进程,统一管理 KVM/QEMU、LXC、Xen 等:
- 提供标准 API(virsh、virt-manager 都基于它)
- 虚拟机生命周期管理、网络、存储编排
virsh,libvirt 命令行工具,用于命令行控制虚拟机。
virt-manager,图形化管理界面,方便可视化操作 KVM 虚拟机。
关键虚拟化支撑组件
EDK2 / OVMF,UEFI 固件,替代传统 BIOS,支持安全启动、大硬盘、GPT 等。
VirtIO 系列驱动,高性能半虚拟化设备标准,是 KVM 性能核心:
- virtio-net:网卡
- virtio-blk:磁盘
- virtio-scsi:SCSI 控制器
- virtio-gpu:显卡
- virtio-balloon:内存 balloon 动态调整
IOMMU / VT-d / AMD IOMMU,硬件 I/O 虚拟化,用于设备直通(PCI Passthrough),让虚拟机直接独占物理设备。
qemu-guest-agent,虚拟机内部代理,实现宿主机与虚拟机高效交互(关机、同步时间、获取信息等)。
ARM64 KVM
核心依赖 ARMv8-A 系列的EL2 异常级别与两阶段地址翻译(Stage 2)
kvm.ko + kvm-arm.ko
通用虚拟化框架与 ARM64 特化模块,合为一体,提供/dev/kvm字符设备接口。
- 职责:vCPU 调度、异常捕获与注入(Trap-and-Emulate)、Stage 2 内存管理、中断虚拟化、KVM/ARM 特定 hypercall 处理。
- 关键路径:
kvm-arm-init完成模块加载与 CPU 热插拔初始化;kvm_vm_ioctl处理用户态创建 VM/VCPU 等请求。
关键寄存器与机制
- HCR_EL2:控制虚拟化开关,如置位
VM位启用 Stage 2 地址翻译。 - VTTBR_EL2 / VTCR_EL2:Stage 2 页表基址与控制寄存器,定义 IPA 空间与页表属性。
- VMID:用于 Stage 2 地址空间标识,减少 TLB 刷新开销。
硬件辅助依赖
- EL2 异常级别:ARMv8 定义,KVM 驻留于此,实现 Guest/Host 严格隔离。
- 两阶段地址翻译(Stage 2):
- Stage 1:Guest VA → IPA(由 Guest 页表控制)。
- Stage 2:IPA → PA(由 KVM 控制,实现内存隔离与懒分配)。
- VHE(Virtualization Host Extensions,ARMv8.1+):让 Host 内核与 KVM 共驻 EL2,消除特权切换开销,接近 Type-1 虚拟化性能。
ARM64 特有关键支撑组件
VGIC(Virtual Generic Interrupt Controller)
- 版本:VGICv3/v4(对应硬件 GICv3/v4),支持 vIRQ/vFIQ 虚拟化Linux Kernel。
- 核心:减少中断 Trap,提升中断响应效率;包含虚拟分发器(VGICD)、虚拟 CPU 接口(VGICR)与中断翻译服务(ITS)Linux Kernel。
IOMMU / SMMU(System Memory Management Unit)
- 职责:实现PCIe 设备直通(Passthrough)与 DMA 重映射,隔离 Guest 设备访问,保障安全性。
- 关键:支持 Stage 1/Stage 2 双重翻译,与 KVM 协同控制设备地址空间。
PMU 虚拟化(Performance Monitoring Unit)
- 职责:让 Guest 直接访问硬件性能计数器,支持性能分析与调优,减少 Trap 开销。
- 接口:通过
kvm_pmu_*系列函数实现计数器读写与溢出处理。
Protected KVM(pKVM,可选)
- 机制:基于 ARM 安全扩展(如 TrustZone)或硬件隔离,保护 Hypervisor 自身与 Guest 内存,提升安全性。
- 场景:边缘计算、机密计算等对安全要求极高的环境。
与 x86_64 KVM 核心差异
| 维度 | ARM64 KVM | x86_64 KVM |
|---|---|---|
| 虚拟化入口 | EL2 异常级别 | VMX 根模式 |
| 内存虚拟化 | 强制两阶段(Stage 1+Stage 2) | 可选影子页表 / EPT |
| 中断控制器 | VGICv3/v4(ITS) | APICv/AVIC |
| 硬件扩展 | VHE(ARMv8.1+)、SMMU | VT-x、EPT、APICv |
核心要点
- EL2 是地基:KVM 必须运行于此,依赖硬件辅助实现隔离与高效异常处理。
- Stage 2 是关键:决定内存虚拟化效率与安全性,2MB/1GB 大页配置可显著降低 TLB Miss。
- VGIC 是性能瓶颈优化点:合理配置可大幅减少中断开销 。
- VirtIO + SMMU是高性能与高安全的标配组合。
总结
CPU / 内存虚拟化→ 内核
kvm.ko+ 硬件 VT-x/AMD-V设备模拟与 I/O→ QEMU-KVM
统一管理→ libvirt + virsh / virt-manager
高性能→ VirtIO 半虚拟化