VMM分类
按虚拟平台分类
该分类依据虚拟机(Guest)操作系统是否感知到VMM的存在,以及指令模拟方式的不同进行划分。
完全虚拟化
完全虚拟化下,Guest操作系统无需任何修改,其内核指令和敏感操作由VMM动态捕获并模拟,Guest自身不感知虚拟化层。
软件辅助的完全虚拟化
该方案不依赖CPU硬件虚拟化扩展,通过纯软件方式处理敏感指令。
- 采用**二进制翻译(Binary Translation)或扫描-陷出(Scan-and-Trap)**技术。VMM在运行时扫描Guest的指令流,将无法直接下发的敏感指令(如x86的POPF、CLI等)动态替换为跳转到VMM模拟例程的陷出指令。
- Guest的非敏感指令直接在物理CPU上执行,敏感指令触发模拟,VMM在软件层模拟其预期效果后返回。
- 存在较大的运行时翻译开销,且无法处理某些需要在Ring 0执行但不可虚拟化的指令(如x86的SGDT/SIDT),兼容性和性能均受限制。
- 代表性实现:早期VMware Workstation。
硬件辅助的完全虚拟化
该方案依赖CPU提供的虚拟化扩展指令集(如x86的Intel VT-x / AMD-V,ARM的虚拟化扩展(EL2))。
- CPU引入根模式(Root Mode)和非根模式(Non-root Mode)。VMM运行在根模式下,Guest运行在非根模式下。
- 敏感指令(如IN/OUT、CPUID、HLT)或特定事件(如EPT缺页)在非根模式下执行时会自动触发VM Exit(虚拟机退出),无需软件扫描或二进制翻译。
- CPU硬件将退出原因和上下文保存在VMCS(虚拟机控制结构,x86)或VMCB(虚拟机控制块,AMD)中,VMM处理完成后通过VM Entry(虚拟机进入)恢复Guest执行。
- 消除了软件翻译开销,性能接近物理机,但VM Exit的频率仍会影响整体吞吐量。
- 代表性实现:KVM(配合QEMU)、VMware ESXi、Microsoft Hyper-V。
类虚拟化
类虚拟化要求修改Guest操作系统的内核源码,将原本特权指令的调用替换为显式的超级调用(Hypercall)。
- Guest通过Hypercall主动陷入VMM,请求执行特定特权操作(如更新页表、I/O请求、时间同步)。
- 与完全虚拟化相比,类虚拟化减少了被动VM Exit的次数,因为Guest清楚地知道自己运行在虚拟化环境中,会主动配合VMM进行资源管理。
- I/O路径通常采用**前端/后端(Frontend/Backend)**驱动模型。Guest加载前端驱动,VMM运行后端服务进程,通过共享内存和事件通道传递数据,绕过设备模拟的开销。
- 缺点是需要维护专用的Guest内核分支或补丁,无法运行未经修改的商业操作系统(如Windows)。
- 代表性实现:Xen的PV(半虚拟化)模式、早期的UML(User-mode Linux)。
按VMM实现结构分类
该分类依据VMM在物理机软件栈中的部署位置和特权层级进行划分。

Hypervisor模型(裸机型 / Type 1)
VMM直接运行在物理硬件之上,不依赖任何宿主操作系统。
- VMM本身具备最高硬件特权级(x86的Ring -1或Root Mode,ARM的EL2),直接管理物理CPU、物理内存中断控制器和物理设备。
- 所有虚拟机(Guest)运行在VMM之上的非特权层。VMM负责物理资源的全局调度和设备驱动管理。
- 由于没有宿主OS的中间层,I/O路径和调度路径较短,资源开销较低,安全隔离性较强。
- 缺点是实现复杂度高,VMM需自带大量硬件设备驱动程序。
- 代表性实现:VMware ESXi、Microsoft Hyper-V(安装时占用底层)、Xen(运行在硬件层)。

宿主模型(主机型 / Type 2)
VMM作为应用程序或可加载内核模块,运行在现有的宿主操作系统(如Linux、Windows)之上。
- VMM依赖宿主机OS完成物理硬件管理(内存分配、进程调度、设备驱动)。vCPU通常实现为宿主机OS的一个用户态进程或线程,由宿主机调度器负责分配物理CPU时间。
- Guest的特权指令由VMM截获后,通过宿主机OS的系统调用或内核接口间接访问物理硬件(如通过文件描述符读写/dev/kvm)。
- 硬件访问路径较长(Guest → VMM → 宿主机内核 → 物理硬件),且I/O性能受宿主机调度抖动影响。
- 优点是易于开发和调试,可复用宿主机的大量驱动和工具链,部署灵活。
- 代表性实现:基于KVM的QEMU(KVM内核模块运行于宿主机内核,QEMU进程运行于用户态,整体被视为宿主模型的一种变体)、Oracle VM VirtualBox、早期VMware Workstation。

混合模型
该模型结合了裸机型和宿主型的架构特点,通常将VMM拆分为特权内核模块 和用户态辅助进程两部分。
- 特权内核模块(如KVM内核模块、Xen Hypervisor)运行在宿主机内核或硬件层,负责执行敏感的CPU和内存虚拟化操作(如VM Entry/Exit处理、EPT页表维护),具有较高调度优先级和直接硬件访问权限。
- 用户态辅助进程(如QEMU系统进程)运行在宿主机用户空间,负责设备模拟(如模拟网卡、磁盘控制器)、PCI拓扑枚举和用户交互配置。
- 该结构将性能敏感的核心路径(CPU/内存)置于内核特权层以减少延迟,将复杂且容错性较高的设备模拟置于用户态以利用宿主机现有的库和驱动,兼顾了性能与可维护性。
- 虚拟化控制平面(如libvirt)通常运行在用户态,通过ioctl或Hypercall与内核模块通信。
- 代表性实现:KVM + QEMU(当前主流Linux虚拟化栈)、Xen + QEMU(设备模拟域)、acrn(针对嵌入式场景的混合型Hypervisor)。