管理程序的三个基本特征:
特权指令是每个指令集架构 (ISA) 的一部分,操作系统内核使用它们在执行的应用程序之间复用 CPU,并管理硬件。特权指令可以修改控制每个应用程序的 CPU 寄存器和标志。因此,在正常情况下,特权指令不应被执行,除非是在运行操作系统内核时。例如,指向进程页表的寄存器只能由特权指令修改。这些指令具有特权,可确保操作系统内核保持对 CPU 的控制并防止任何应用程序破坏操作系统内核或其他应用程序。
硬件虚拟化的挑战在于正确处理 Guest 内核中的特权指令。 因为 Guest 以非特权模式运行,以便 Host 操作系统或管理程序可以保持对硬件资源的控制。如果 Guest 内核没有在非特权模式下运行,那么多个 Guest 操作系统内核可以通过运行特权指令来更改 CPU 状态(彼此不知道),从而可能破坏彼此或 Host 操作系统。
只有 Host 操作系统具有执行特权指令的必要权限。 当任何应用程序执行特权指令时,Host 操作系统都会收到通知(例如来自称为陷阱的机制)。陷阱会停止正在执行的程序并将控制权切换到内核,这可能会杀死试图执行特权指令的程序。当在 CPU 上运行 Guest 内核时,由于 Guest 在非特权模式下运行,因此执行的任何特权指令都会类似地对 Host 操作系统或虚拟机管理程序产生陷阱。
处理 Guest 虚拟机的特权指令是虚拟化操作系统的一个基本挑战。历史上在管理程序中用于处理特权指令的一种技术称为陷阱和仿真。使用陷阱和模拟的管理程序通过让 Host 操作系统代表 Guest 操作系统模拟特权指令的行为并允许 Guest 继续执行下一条指令来响应 Guest 操作系统尝试执行特权指令。 通过模拟特权指令的效果,比如更新页表指针,Guest 操作系统可以继续执行,并且管理程序保持控制。虽然陷阱和模拟方法相当简单,但它的缺点是每条被捕获的指令都会付出性能损失,幸运的是,特权指令相对较少,只要大多数指令仍然可以由 CPU 直接执行,性能仍然可以接受。
x86 体系结构对陷阱和仿真设计提出了挑战,一些特权指令在非特权模式下执行时不会产生陷阱,而是简单地忽略这些指令,因此,trap-and-emulate 模型不能用于 x86。
随着时间的推移,二进制翻译和半虚拟化成为陷阱和模拟的替代方案,二进制翻译通过重写正在执行的 Guest 操作系统的二进制代码并将特权指令替换为对管理程序的调用来解决陷阱问题。 VMware 和 VirtualBox 是两个使用二进制转换的成熟的管理程序。二进制翻译的优势在于它几乎可以虚拟化任何与 x86 兼容的操作系统,因为特权指令是在运行时即时翻译的。二进制翻译确实会产生开销,因为必须扫描 Guest 操作系统的可执行文件以获取特权指令。尽管存在一些缺点,但二进制翻译是一种成功的方法,它允许 x86 架构被虚拟化。
半虚拟化需要更改 Guest 内核的源代码,以将任何特权指令替换为对管理程序的调用。半虚拟化与二进制翻译有不同的权衡。例如,半虚拟化需要对每个 Guest 操作系统进行不同的修改。 此外,Windows 等闭源操作系统需要操作系统所有者的合作才能进行必要的修改,半虚拟化的优点包括避免像二进制翻译那样即时翻译 Guest 指令的开销, 以及避免使用陷阱和模拟方法进行陷阱的开销,因为需要陷阱的指令是提前翻译的。
2003 年 Xen 项目的发布是半虚拟化领域的一项重大成就。Xen 证明了半虚拟化可以在 x86 架构上实现接近原生的性能。鉴于 Xen 是开源的,它还为大规模使用虚拟化提供了一种经济高效的高性能解决方案。Xen 发布后,半虚拟化一词的范围扩大,超出了修改操作系统以删除特权指令的含义。该术语已扩展到不仅包括修改后的操作系统,还包括专门为虚拟环境修改或设计的 VM 中的任何虚拟硬件或软件(例如总线或设备)。 半虚拟化设备不必在真实的物理硬件中具有等效的实现,因为它被设计为仅在 VM 中运行。Xen 的拆分驱动模型将被视为半虚拟化设计,因为它的设计仅适用于 Xen 管理程序。
x86 上的硬件虚拟化,由于二进制转换和半虚拟化解决方案允许在 x86 ISA 上进行硬件虚拟化,因此虚拟化的使用在桌面和服务器环境中都有所增长,由于虚拟化的日益普及,两个主要的 x86 供应商 Intel 和 AMD 都宣布扩展 x86 ISA 以使虚拟化 x86 更容易,不需要二进制转换或操作系统半虚拟化。 Intel 将其扩展命名为 Virtual Machine eXtensions (VMX),AMD 将其扩展命名为 Secure Virtual Machine (SVM)。各自的扩展在设计上彼此不同,并且不兼容。第一批带有 SVM 的 AMD CPU 于 2006 年年中出货。简而言之,新指令可以更轻松地创建和控制虚拟机。几乎所有当前的 x86 CPU 都带有硬件虚拟化支持(一些低功耗移动芯片和低成本服务器芯片除外)。通过消除对二进制转换或内核半虚拟化的需求,增加了硬件虚拟化支持使得实现 x86 管理程序变得更加简单。