OS VMM
虚拟机
虚拟机是用软件模拟出来的计算机。它在一台物理机器上创建多个彼此隔离的执行环境,每个环境可以独立运行一个操作系统,就像独占一台真实机器一样。
VMM 负责管理这些虚拟机。VMM 也叫 Hypervisor。
虚拟化的典型用途:
- 服务器整合:多台虚拟机跑在同一台物理服务器上,提高硬件利用率、降低运维成本。
- 隔离测试:在一台机器上同时运行多个操作系统实例,彼此互不影响,适合安全研究和兼容性测试。
- 兼容旧系统:在新硬件上运行为旧操作系统编写的程序,无需保留老机器。
VMM 的两种类型
| 类型 | 位置 | 特点 |
|---|---|---|
| 第一类 VMM | 直接运行在硬件上,本身就是一个精简的操作系统 | 管理虚拟机更直接,性能较高,常用于数据中心(如 VMware ESXi、KVM) |
| 第二类 VMM | 运行在宿主操作系统上,作为一个用户态或内核态程序 | 安装使用方便,常见于桌面虚拟化(如 VirtualBox、VMware Workstation) |
第一类 VMM 直接面对硬件,不需要经过宿主 OS 中转,因此指令模拟和资源调度的路径更短。第二类 VMM 借助宿主 OS 已有的设备驱动和电源管理,实现更简单但开销更大。
CPU 虚拟化的核心挑战
虚拟化的根本困难在于特权指令的控制权。
客户操作系统认为自己拥有整台机器,运行在最高特权级(Ring 0),可以执行任何特权指令。但实际上它不能真正控制物理硬件——否则一台虚拟机里的操作可能破坏另一台虚拟机,甚至破坏宿主机。
陷入与模拟
解决思路是 trap-and-emulate,三步循环:
- 降级执行:VMM 运行在最高特权级;客户 OS 被放在较低特权级运行。
- 陷入:客户 OS 执行特权指令时,CPU 检测到权限不足,自动把控制权交还给 VMM。这个机制叫 trap 或 VM exit。
- 模拟并返回: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 的实现复杂度大幅降低。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!