虚拟机

虚拟机是用软件模拟出来的计算机。它在一台物理机器上创建多个彼此隔离的执行环境,每个环境可以独立运行一个操作系统,就像独占一台真实机器一样。

VMM 负责管理这些虚拟机。VMM 也叫 Hypervisor

虚拟化的典型用途:

  • 服务器整合:多台虚拟机跑在同一台物理服务器上,提高硬件利用率、降低运维成本。
  • 隔离测试:在一台机器上同时运行多个操作系统实例,彼此互不影响,适合安全研究和兼容性测试。
  • 兼容旧系统:在新硬件上运行为旧操作系统编写的程序,无需保留老机器。

VMM 的两种类型

类型 位置 特点
第一类 VMM 直接运行在硬件上,本身就是一个精简的操作系统 管理虚拟机更直接,性能较高,常用于数据中心(如 VMware ESXi、KVM)
第二类 VMM 运行在宿主操作系统上,作为一个用户态或内核态程序 安装使用方便,常见于桌面虚拟化(如 VirtualBox、VMware Workstation)

第一类 VMM 直接面对硬件,不需要经过宿主 OS 中转,因此指令模拟和资源调度的路径更短。第二类 VMM 借助宿主 OS 已有的设备驱动和电源管理,实现更简单但开销更大。

CPU 虚拟化的核心挑战

虚拟化的根本困难在于特权指令的控制权

客户操作系统认为自己拥有整台机器,运行在最高特权级(Ring 0),可以执行任何特权指令。但实际上它不能真正控制物理硬件——否则一台虚拟机里的操作可能破坏另一台虚拟机,甚至破坏宿主机。

陷入与模拟

解决思路是 trap-and-emulate,三步循环:

  1. 降级执行:VMM 运行在最高特权级;客户 OS 被放在较低特权级运行。
  2. 陷入:客户 OS 执行特权指令时,CPU 检测到权限不足,自动把控制权交还给 VMM。这个机制叫 trapVM exit
  3. 模拟并返回:VMM 检查被拦截的指令、判断其意图,在自己的数据结构和硬件上模拟执行结果,然后把控制权返回客户 OS。

客户 OS 始终不知道自己在”坐牢”——它以为自己执行了特权指令,实际上每条敏感指令都被 VMM 拦截并代劳。

硬件辅助

早期的 x86 架构对虚拟化支持不完善:部分敏感指令在非 Ring 0 下不触发 trap,VMM 无法完全拦截。现代 CPU 把拦截能力做进了硬件:

技术 来源 做法
VT-x Intel 引入 VMX root 模式(VMM)和 non-root 模式(客户 OS),客户 OS 的敏感操作自动触发 VM exit
AMD-V AMD 类似的硬件辅助,引入 host 模式和 guest 模式

有了硬件辅助,VMM 不再需要复杂的软件手段(如动态二进制翻译)去补全拦截缺口——CPU 自身就保证所有需要拦截的敏感操作都能被捕获。

权限级模型

支持虚拟化的 CPU 提供的特权层次大致为:

层级 运行内容 说明
VMM 层(VMX root / Ring -1) Hypervisor 最高特权,管理所有物理资源
Ring 0(内核态) 客户 OS 内核 客户 OS “以为”自己拥有整台机器
Ring 3(用户态) 普通应用程序 最低特权,只能通过系统调用请求服务
一句话概括

虚拟化的核心难题始终是同一个:既要让客户 OS 感觉自己在控制硬件,又要保证真正的物理资源始终在 VMM 的掌控之下。trap-and-emulate 是软件解法,硬件辅助(VT-x / AMD-V)把这个难题从软件层移到了硬件层,让 VMM 的实现复杂度大幅降低。