天天看点

虚拟机技术综述-2 硬件虚拟机

    2 硬件虚拟机 硬件虚拟机支持在一台计算机上存在多个运行时环境,每个运行时环境可以支持一个操作系统。硬件虚拟机能够使为某种操作系统编写的程序在另外一种操作系统上运行,或者提供比单一操作系统上多进程之间更严格的运行时沙箱。硬件虚拟机现在也被称作虚拟化或者虚拟服务器。 能提供硬件虚拟机功能的宿主软件也被称作虚拟机监控器或虚拟机管理程序。 硬件虚拟机软件主要有三种实现方式:      仿真,整系统模拟,动态翻译全虚拟化。虚拟机模拟完整的硬件,使一个未修改的操作系统可以再在一种完全不同的微处理器上运行。Bochs、DosBox、 PearPC 、 QEMU 、 QuickTransit 、 Simics 、 VirtualPC 7 for Mac。      半虚拟化。虚拟机管理器提供一个应用程序编程接口供修改后的操作系统使用,能让一个经过修改的操作系统在一种完全不同的微处理器上运行。这个应用程序编程接口是一个抽象的整合硬件功能的接口。 Denali 、Logic Domains、 TRANGO 、 View-OS 、 Xen 。                本地虚拟化,全虚拟化。虚拟机模拟部分硬件,使未修改的操作系统能够在隔离状态下运行,但需要该操作系统与底层硬件使用相同类型的微处理器。本地虚拟化用软件方式模拟底层硬件不支持的指令,但最新的Intel和ADM的部分产品已经支持硬件辅助的本地虚拟化。这种虚拟机的实例有VMware公司64位x86操作系统虚拟化和Virtual Iron公司的32位和64操作系统的虚拟化、 Virtual Iron 。 2.1 仿真和动态二进制翻译 对硬件虚拟机来说, 一个具有挑战的问题是支持与宿主机硬件上执行的指令集不同的指令集,比如在一种指令集硬件系统之上仿真另一种指令集。 最直接的仿真方法是解释。解释程序执行目标指令集的取指令来仿真每一个源指令集中的指令。这是一个相对较慢的过程,解释一条源指令可能需要几十条目标指令。 二进制翻译经常被用来提高性能。二进制翻译是把一段源指令转换成一段目标指令并执行同等的功能。翻译过程本身可能会有相当大的开销,但是如果一段源指令被翻译后的目标指令能够被缓存下来,以后重复执行该段源指令就会比解释执行快。因为二进制翻译是进程级虚拟机最重要的特性,所以有时进程级虚拟机被称为动态二进制翻译器。   解释和二进制翻译有不同性能。解释有着相对较低的启动开销,但指令的每一次模拟执行都要消耗一定的时间。二进制翻译有着较高的启动开销,但每次重复进行会比较快。因此,有些虚拟机使用了经过变形的分段仿真策略,例如,根据程序的行为收集统计信息。开始,一些指令是解释执行的,同时记录下那些经常被执行的指令序列。这些经常被执行的序列使用二进制翻译。一些系统可能会对执行频率非常高的翻译指令做额外的优化。在绝大多数虚拟机执行一段代码中,翻译和二进制翻译都会使用到。   2.2 二进制代码优化器 大多数二进制翻译器不仅执行从源代码到目标代码的转换,同时也能执行一些代码优化。这就产生了宿主指令集和客户指令集相同的虚拟机,它的主要功能是二进制代码的优化。所以,相同指令集动态二进制优化器的实现方式与虚拟机非常相似,包括分段优化和优化代码的缓存。相同指令集动态二进制优化器能够在程序执行过程中收集统计信息并利用这些统计信息优化二进制代码。   2.3 系统级虚拟机 系统虚拟机为多个进程共存提供一个完整的系统环境。这种虚拟机在20世纪六十年代末七十年代初被开发出来,这些虚拟机也是虚拟机这个术语的来源。使用系统级虚拟机技术,能够使一个宿主硬件平台同时支持多种客户操作系统。在20世纪六七十年代,大型机非常庞大并且价格昂贵,计算机通常被大量的用户共享。不同的用户群可能希望在这个共享的硬件上运行不同的操作系统,而虚拟机不刚好能满足这个需求。但随着工业的发展,硬件变得越来越便宜,桌上电脑也越来越普及,对于系统虚拟机的需求也越来越少。 但是近来,系统虚拟机正受到更多人的关注。那种庞大的昂贵的大型机现在被作为服务器和服务器群,这些服务器可能被很多用户共享使用。系统虚拟机最大的特点可能是他们提供多种操作系统的同时在一个硬件平台上运行的安全机制。在一个客户系统上运行的软件与另一个客户系统上的软件是完全隔离的,当一个客户系统的安全性受到威胁或者遭受灾难,运行在另一个客户系统上的软件不会受到影响。同时支持多种操作系统的能力可能不被大多数用户来说也是一个很重要的吸引力,例如同时支持Windows和 Linux, 如图1。 对系统虚拟机来说,平台复制是虚拟机管理器的重要功能,而关键问题是在多个客户操作系统之间分配唯一的底层硬件资源。虚拟机管理器管理着硬件资源,所有的客户操作系统及其上的应用程序都需要经过虚拟机管理器的控制。当执行某些指令,特别是涉及到的共享硬件资源的指令,会通过虚拟机控制器解释这些指令,检查指令的正确性并执行相关操作,客户软件不会感觉到虚拟机控制器的操作。 从用户的观点来看大多数系统虚拟机都提供了几乎相同的功能,不同的虚拟机其不同之处在于他们是如何实现的。在图2和图3中,可以看到,计算机系统存在多个接口,这就导致系统虚拟机软件可以放置在不同的接口上。下面介绍两种比较重要的实现方式。 系统虚拟机的第一种实现方式,是虚拟机管理器放在硬件上,虚拟机放在虚拟机管理器之上,如图5所示。虚拟机管理器以最高权限模式运行,所以虚拟机管理器能够解释并实现所有客户操作系统的指令。从某些方面来说,这种虚拟机架构是最有效的,它以几乎相同的方式支持所有的客户操作系统。而缺陷就是,至少对于桌上电脑用户来说,安装虚拟机管理器之前必须完全擦除现有的系统,并且在安装虚拟机管理器之后安装客户操作系统。另一个缺陷,是需要提供针对虚拟机管理器的输入输出设备驱动,因为虚拟机管理器直接和输入输出设备交互。

虚拟机技术综述-2 硬件虚拟机

图5 虚拟机位于硬件层之上 另一种如图6所示,虚拟机管理器放在已存在的宿主操作系统之上,这个虚拟机也被称为宿主虚拟机。这样,安装虚拟机的过程就类似于安装一个典型的应用程序的过程。并且,虚拟软件能够利用宿主操作系统提供设备驱动和其他基本服务。而缺陷就是,这样会带来一些性能的损失,因为操作系统的服务要通过更多的软件层次来实现。宿主虚拟机方式被使用在VMware的实现中,它是一个现代的系统虚拟机,运行于IA-32硬件平台之上。

虚拟机技术综述-2 硬件虚拟机

图6 虚拟机位于操作系统之上 2.4 全系统虚拟机与仿真 对于传统的系统虚拟机,所有的系统软件和应用软件都使用与底层硬件相同的指令集架构。但在另外的一些情况下,客户系统和是宿主系统使用不同的指令集架构。例如,基于PowerPC的Apple系统和Windows系统使用不同的指令集架构,这也是两种最流行的桌面系统。因为软件系统和硬件系统紧密地联系在一起,会导致用户需要购买同一软件的针对不同平台的版本,这会使软件支持变得复杂并且会是用户的购买力下降。这种情况导致了对系统虚拟机的需求,这是一个完整的软件系统,包括操作系统和应用程序,它能够支持在宿主系统上运行另一种不同的指令集和操作系统。因为指令集结构不同,应用程序和操作系统代码都需要仿真。对完整系统虚拟机来说,常用的一种实现方法是将虚拟机管理器和客户软件放在一个传统的宿主操作系统上。 图6描述了一个系统虚拟机,它建立在一个拥有自己的操作系统和应用程序的传统系统之上。这种虚拟机的一个例子是Virtual PC,它能使Windows操作系统运行在Macintosh系统上。虚拟机软件是作为一个应用程序运行在宿主操作系统上,它使用宿主系统的指令集操作。为了实现这种类型的虚拟机,虚拟软件需要仿真整个硬件环境。它必须控制所有指令的仿真,并且需要将客户系统的指令集操作转换成对应的宿主操作系统的系统调用。即使使用二进制翻译,也无法有效利用宿主系统指令集架构的特性,如虚拟内存管理和中断管理。另外,如果客户系统和宿主系统的硬件资源有显著的差异,则会带来实现上的一些问题, 而解决这些问题是实现完整系统虚拟机面临的主要挑战。 2.5 协同设计虚拟机 以上所讨论的虚拟机模型, 都是为了功能和移植,包括在同一个平台上支持多种操作系统或者多种指令集架构。事实上, 这些虚拟机都是基于已经存在的某种标准指令集或操作系统开发的。大体上来说,提高性能不是一个目标, 反而降低性能损失常常是一个需要考虑的问题。 协同设计虚拟机则有不同的目标, 并且有着不同的实现方式。设计这些虚拟机是为了使新的指令集架构或硬件实现能提高性能或提高效率。宿主指令集架构可能是全新的,也可能是基于某种存在的指令集架构增加或删除了部分指令。协同设计虚拟机没有对应的指令集架构应用程序,它本身可以看成是硬件实现的一部分。 在某些方面,协同设计虚拟机类似于在许多高性能超标量体系结构微处理器中用到的硬件虚拟方法。在这种设计中,将架构中的寄存器重命名为物理上的真实的寄存器,将复杂的指令分解为较简单的指令。      ----刘黎明( [email protected] )