对完全虚拟化和超虚拟化的硬件支持
回想一下 IA-32(x86)体系结构在进行虚拟化时会产生的一些问题。特定的特权模式指令无法捕获,基于所使用的模式还可能返回不同的结果。例如,x86 STR 指令可以检索安全状态,但是所返回的值要取决于请求者特定的特权级别。在尝试在不同的层次对不同的操作系统进行虚拟化时,这会出现问题。例如,x86 支持 4 环保护,其中级别 0 (最高特权)通常运行操作系统,级别 1 和 2 支持操作系统服务,级别 3(最低级别)支持应用程序。不过硬件供应商已经认识到了这种缺陷(以及其他一些问题),并且已经开发了一些支持并加速虚拟化的新设计。
Intel 正在开发新虚拟化技术,能在 x86(VT-x)和 Itanium?(VT-i)体系架构上支持 hypervisor。VT-x 支持两种格式的操作,一种用于 VMM(root),另外一种用于客户操作系统(非 root)。root 格式完全是特权级的,而非 root 格式是非特权级的(即使对环 0 来说也是如此)。这种体系架构支持定义指令来使 VM(客户操作系统)退出到 VMM 和保存处理器状态。
AMD 也开发了硬件辅助虚拟化技术,称为 Pacifica。除了其他一些特性之外,Pacifica 还为在特殊指令执行时保存的客户操作系统维护了一个控制块。VMRUN 指令允许虚拟机(及其相关的客户操作系统)一直运行,直到 VMM 重新获得控制权为止(这也是可配置的)。这种可配置能力允许 CMM 为每个客户操作系统定制特权指令。Pacifica 还可以使用宿主和客户内存管理单元(MMU)表来进行地址转换。
这些新技术也可以应用到此处讨论的很多其他虚拟化技术中,包括 Xen、VMware、User-mode Linux 等。
Linux KVM(内核虚拟机)
Linux 传出的最新消息是将 KVM 合并到 Linux 内核中(2.6.20)。KVM 是一种完全虚拟化解决方案,它有一个方面非常独特:它将 Linux 内核转换为一个使用内核模块的 hypervisor。这个模块允许使用其他客户操作系统,然后在宿主 Linux 内核的用户空间中运行(参见图 7)。内核中的 KVM 通过 /dev/kvm 字符设备来公开虚拟化后的硬件。客户操作系统使用为 PC 硬件仿真修改过的 QEMU 进程与 KVM 模块接口。
图 7. 使用内核虚拟机(KVM)的虚拟化
KVM 模块向内核中引入了一个新的执行模块。普通内核支持内核 模式和用户 模式,而 KVM 则引入了一种客户 模式。客户模式用来执行所有非 I/O 客户代码,而普通用户模式支持客户 I/O。
KVM 的引入是 Linux 的一个有趣革新,因为它代表了作为主流 Linux 内核一部分的第一个虚拟化技术。它已经存在于 2.6.20 树中,不过也可以作为 2.6.19 内核的一个内核模块使用。当在支持虚拟化的硬件上运行时,KVM 支持 Linux(32 位和 64 位)和 Windows(32 位)客户机。
结束语
如果 40 年前出现的技术还可以算是"新"技术的话,那么虚拟化就是一个重要的新技术领域。虚拟化技术已经在很多场合中应用过了,但现在主要的关注点是服务器和操作系统的虚拟化。与 Linux 非常类似,虚拟化为性能、可移植性和灵活性提供了很多选项。这意味着您可以选择最适合于您自己应用程序的虚拟化方法。