#虚拟化#虚拟化从入门到精通(一)——认识及理解虚拟化

一般说来,计算系统的虚拟化可以在指令集、硬件、操作系统、库以及高级语言等五个不同的层次上实现。目前流行的许多虚拟化技术,如以Xen为代表的部分虚拟化、以VMWare代表的全虚拟化、以Intel VT和AMD Pacifica为代表的硬件虚拟化、以及预虚拟化等,通常在硬件或操作系统层面上实现,旨在解决如何将多种不同的软件支撑环境(如操作系统)集成在特定硬件平台下这一问题。

        在以前的虚拟化历程中,x86架构并没有成为虚拟化技术发展的受益者,主要原因是x86架构在设计之初并没有考虑支持虚拟化技术,它本身的结构和复杂性使得在其之上进行虚拟化非常困难。然而,上个世纪九十年代末期,VMware和其他虚拟化软件厂商率先为虚拟化技术在x86服务器环境下开辟了道路,使得虚拟化应用的前景更加广阔。它们实施的是一种软件解决方案,以虚拟机监视器(VMM)为中心使服务器平台实现虚拟化。然而,在这种纯软件的“完全虚拟化”模式中,每个客户机操作系统获得的关键平台资源都需要VMM控制,并由它来分配,以避免发生冲突。为了处理这些相关的控制,需要利用二进制转换来进行操作,而二进制转换的开销使得“完全虚拟化”的性能大打折扣。为解决这个问题,引出了另一种新的虚拟化模式,即在Denali项目和Xen项目中出现了“半虚拟化”技术。半虚拟化的实施不需要二进制转换,而是通过对客户机操作系统进行代码级修改,从而为操作系统提供新的接口,以使新的、定制的客户操作系统获得额外的性能和高扩展性。但是,修改客户机操作系统非常繁琐,带来了一些系统指令级别冲突以及运行效率的问题,需要软件开发商、集成商等投入大量的时间和人力对系统进行优化。此时,虚拟化技术的发展走到了硬件支持阶段,使半虚拟化的障碍得到了解决。硬件虚拟化技术就是把纯软件虚拟化技术的各项功能用硬件电路来逐一实现。作为发挥多核处理器性能的一个有效手段,Intel和AMD都在硬件级提供了对虚拟化的支持,比如Intel的VT技术和AMD的SVM技术。Intel的VT技术提供了一个名为VMX Root的新特层阶级,该级别专门用于运行VMM,它对标准x86架构进行了优化。在消除了对CPU半虚拟化和二进制转换技术的需求后,硬件已经能支持多种未经修改的客户机操作系统直接运行,VMM的设计得到极大简化,进而使 VMM能够按通用标准进行编写,减少了相关的性能开销,性能更加强大。

 

1 指令级虚拟化

        在指令集层次上实现虚拟化,实际上就是将某个硬件平台上的二进制代码转换为另一个硬件平台上的二进制代码,从而实现不同指令集间的兼容,这一技术也被形象地称作“二进制翻译(Binary Translation)”。而在指令集层次上进行虚拟化,能够使同一系统程序或应用程序运行在不同结构的硬件平台之上,扩大了这些虚拟化技术的应用范围。因此,指令级虚拟化技术是其它虚拟化技术的必要补充,也是计算系统虚拟化技术不可或缺的关键部分。

指令集架构级虚拟化通过纯软件方法,模拟出与实际运行的应用程序(或操作系统)所不同的指令集去执行,采用这种方法构造的虚拟机一般称为模拟器(Emulator)。一个典型的计算机系统由处理器、内存、BUS、硬盘驱动器、磁盘控制器、定时器、多种I/O设备等等部件组成。模拟器通过将客户虚拟机发出的所有指令翻译成本地指令集,然后在真实的硬件上执行。这些指令包括典型的处理器指令(例如x86中的add,sub,jmp等等)和特殊的I/O指令(例如in/out指令)。当然,一个模拟器要成功的模拟一个真实的机器,它必须能够模拟真实机器所能做的一切事情,包括读ROM芯片、重启、系统开关等等。

        这种类型的虚拟机结构,就其简单性和健壮性而言非常好,但同时,它还具有其它一些优点和缺点。就优点而言,这种类型的虚拟机能够实现应用以及操作系统的跨平台执行。由于模拟器的工作原理是将虚拟执行环境中的指令翻译成主机平台上的指令来执行,因此只要能够通过主机平台上的指令来完成虚拟执行环境中与指令相同的任务,当客户平台的架构改变时,它也可以很容易的适应平台的变化。这样,它在客户平台和主机平台之间就没有执行严格的绑定。例如,模拟器能够让原来运行在x86结构上的操作系统和应用程序在PowerPC系列处理器、甚至是为嵌入式系统而设计的ARM系列处理器上运行。然而,架构的便携性也带来一些性能上的开销。因为由仿真计算机发出的每一条指令都需要用软件方法来解释,这就导致较大的性能损失。

在Java语言中,其后端实现了一种新的指令集的编译器。正是由于这样的一个后端使得Java成为一种与平台无关的语言,能够在包括Windows、Unix、Mac以及其它流行的操作系统上运行。这个后端又被称为Java虚拟机[Bill Venners, 1996],简称JVM。JVM是一种执行Java字节码(byte code)的虚拟机。这些代码通常由Java编译器生成,需要在JVM上执行的程序必须被编译成由字节码组成的标准的二进制形式,即.class文件。这些二进制文件再由JVM runtime解释执行。除此之外,JVM还为Java字节码提供了一个操作环境,因此,Java平台其实是Java虚拟机和Java操作环境(JRE)的结合。因为JVM最终通过一些底层语言来实现,因此它可以提供比传统机器更好的灵活性。

举例:典型的二进制翻译系统

随着Internet和移动计算技术的快速发展,平台无关的程序设计开发平台如Sun公司的Java与Microsoft公司的.NET技术得到越来越多的关注。用这些程序设计语言编写的程序在发布时被编译为一种与平台无关的中间目标代码,例如Java源程序被编译为Java字节码,而.NET程序则被编译为Microsoft的中间语言MSIL。

Java字节码面向Sun定义的基于栈的Java虚拟机(Java Virtual Machine,JVM)结构,需要运行在Java处理器,或是软件实现的JVM上(这也是更多的情况),这使得Java在可移植性、安全性和代码体积等方面具有相当的优势。但它也带来了一个新的挑战,即如何提升Java程序的性能。JVM的最初实现是由软件对字节码进行解释执行,这严重制约了Java程序的性能。为了提高JVM的性能,研究人员提出了即时(Just In Time,JIT)编译的方法。

JIT编译是在Java程序的一个方法被调用之前,将其编译为宿主机的本机代码执行。编译后的目标代码被缓存起来,以避免重复编译的开销。这样,对于长时间运行的Java程序,JIT技术的引入将显著提高其性能。由于当前大部分处理器都采用面向寄存器的结构,因此如何进行寄存器分配是提高JIT编译后代码执行效率的重要因素。同时,在编译过程中还有许多进行优化的机会。Sun公司发布的JDK中就专门包含了一个HotSpot优化组件,能够对多次执行的热点代码进行优化。

        JIT编译是一种从中间目标代码到宿主机结构的动态编译,许多JIT编译中提高性能的方法与技术都可以应用到动态二进制翻译系统中。与动态二进制翻译不同的是,JIT编译的源结构,即中间目标代码是一种相对比较“高级”的指令表示形式,其中包含了更多的语义信息,这使得JIT编译时可以进行更多的代码优化和变换,以及进行安全检查等操作。

 

2 硬件级虚拟化

硬件抽象层面(Hardware Abstraction Layer,即HAL)虚拟化实际上与指令集架构级虚拟化非常相似,其不同之处在于,这种类型的虚拟化所考虑的是一种特殊情况:客户执行环境和主机具有相同指令集合的情况,并充分利用这一特点,让绝大多数客户指令在主机上直接执行,从而大大地提高了执行的速度。今天,大部分商业虚拟化软件在流行的x86平台使用此虚拟化技术来提高效率,说明了这类虚拟化技术的可行性与实用性。该虚拟化技术可以将虚拟资源映射到物理资源并在虚拟机计算中使用本地硬件。当模拟机需要访问关键物理资源时,模拟器接管其物理资源并妥善地多路复用。

这种虚拟化技术要能够正确工作,所构造的虚拟机(VM)必须对其中的一些特权指令(例如修改页表等操作)进行处理,执行时产生陷入并将它传递给下层虚拟机管理器(VMM)执行。这是因为在VM中运行的未加修改的操作系统会利用特权指令得到CPU和内存资源。当某特权指令执行时产生一个陷入,便马上将指令发送VMM,这使得VMM可以完全控制虚拟机并保持每个VM隔离。然后,该VMM在处理器中执行该指令,并将模拟结果及特权指令返回给VM。大多数商业虚拟机软件,都使用像代码扫描和动态指令重写这样的技术来解决这些问题。

其中独立虚拟化技术的特点是虚拟机管理器直接运行在物理硬件之上(这种模式又被称为Hypervisor模式),并在其上构造多个虚拟执行环境。在这种情况下,虚拟机管理器实质上既充当了主机操作系统又充当了虚拟机管理器。独立虚拟化技术的优点在于能够直接操纵硬件,实现对底层硬件的完全控制,避免了调用主机操作系统的额外开销。然而,由于底层的每一个硬件都需要设备驱动的支持,独立虚拟化就需要重新为这些底层硬件去开发驱动程序(这就需要几乎所有设备生产厂商的支持),所以独立虚拟化的缺点在于它通常在硬件支持方面非常有限。

基于主机操作系统的虚拟化技术的特点是虚拟机管理器运行在主机操作系统之上,并借助主机操作系统去管理内存,完成处理器的调度、硬件驱动和资源管理[Jay Munro, 2001]。基于主机操作系统虚拟化技术的优缺点则正好与独立虚拟化技术相反,虽然通过主机操作系统间接地访问硬件导致了额外的开销,然而却不存在对底层硬件设备的支持问题。理论上,只要主机物理设备能够支持的硬件,虚拟机管理器软件都能支持,并能够将这些设备映射到它所构造的客户虚拟机中。这类虚拟化技术通常应用在对性能要求不是很高的场合(如桌面PC),VMware Workstation就是这类虚拟化软件的一个典型例子。

 

举例:VMware Workstation

VMware产品针对基于x86的工作站和服务器,它必须考虑和解决多个基于x86的操作系统(客户虚拟机)并发执行的问题。然而,具有漫长历史的x86结构,在设计之初并没有考虑到虚拟化应用的需要。一些特权指令(如对全局描述符表GDT、全局中断描述符表IDT以及页表的修改、以及I/O指令)的存在,将可能导致一个(客户)操作系统的执行对主机状态的修改,而破坏其他操作系统的执行环境。VMware虚拟化软件通过patent-pending技术来解决这个问题,动态改写主机的部分代码,只要涉及到对硬件状态的修改就插入陷阱,让虚拟机管理器来处理。虽然它解决了问题,但增加了翻译和执行开销。VMware通过缓存翻译指令,并尽可能地重用这些指令块来减小开销。然而,这又增加了一些难以避免的缓存代价。

IA32平台的工作方式可以帮助理解VMware Workstation软件是如何安装和运行的。在英特尔架构上,其保护机制提供了四个特权级别:从0到3。这些级别也称为环(ring)。这些保护环仅存在于i386以后的保护模式(Protected Mode)中,而目前流行的多任务操作系统(如Windows和Linux),都运行在该模式下。据英特尔公司称,环0指操作系统内核服务,环1和2为设备驱动,环3属于应用程序级。然而,在实际中,大多数操作系统和设备驱动在环0运行,在环3应用。特权指令只允许在环0执行,如果在其他以外的地方执行会造成保护冲突。

VMware Workstation软件由三个部分组成:VMX驱动、安装在环0的VMM以及在环3的VMware应用程序(VMApp)。VMX驱动器安装在操作系统内部,获得VMM所需要的特权级别。当执行时,VMApp将VMM装载入带有VMX驱动的内核内存,并授予其最高级别(环0)。在这一点上,主机操作系统也知道VMX驱动及VMApp,但却不知道VMM。现在该机器有两个世界:主操作系统和VMM。VMM可以直接访问处理器硬件或通过VMX驱动访问主操作系统。该系统的体系结构如图1-4所示。

计算系统虚拟化学习整理

 

当客户操作系统或运行在其上的应用程序只是进行纯粹的计算时,这些计算指令都通过虚拟机管理器(VMM)直接在物理CPU上执行(因为这些指令不会修改物理或虚拟硬件状态)。对于属于特权指令的I/O指令,它们的执行将陷入到虚拟机管理器中,并通过一个转换在主操作系统中执行。在客户虚拟机中要求的I/O操作被翻译成更高级别的I/O调用,并通过VMApp被主机操作系统调用,结果通过交互返回给VMM。

举例:Xen

Xen[P. Barham et al, 2003]是剑桥大学的研究人员开发的一个开源项目,它提出了一个需要修改客户操作系统的虚拟化体系结构。虽然Xen与Denali[A. Whitaker et al., 2002]一样同是采用半虚拟化架构,但它们有着不同的目标。Denali的半虚拟化架构不用保证应用程序二进制接口(ABI)的兼容性,因为它用来支持数以千计运行网络服务的虚拟机,大多数是小规模和非主流的。而Xen和商业操作系统一样保持了相同的ABI。尽管它的确需要对操作系统进行修改,但修改可以尽可能的少。Denali虚拟化命名空间,而Xen认为在客户操作系统直接访问物理资源时,在虚拟机管理器中的“安全访问控制”就足以确保对物理资源的保护。

和其他商业虚拟机软件相比,Xen有很多独特的地方。比如它导出了一个新的轻量级事件机制代替了在x86架构中CPU和I/O设备之间的硬件中断,Xen的虚拟机管理器和各虚拟机之间的数据传输则采用了异步I/O环等等。需要指出的是,随着CPU生产厂家对虚拟化支持的推广(如Intel的VT技术以及AMD的SVM技术),新版本的Xen已经能够支持这些新技术,采用CPU虚拟化支持所构造的虚拟机被称为硬件虚拟机(Hardware Virtual Machine,简称HVM)。在硬件虚拟机中,客户操作系统不需要修改就能直接运行。

举例:KVM

KVM[Kvm.qumranet.com]是第一种成为传统Linux内核(V2.6.20)一部分的虚拟化技术,它为Linux系统提供了一种新的划分机制。其特点是系统内核通过添加内核模块使内核自身成为系统管理程序。并且,KVM向Linux引入了一种除现有内核和用户模式之外的新的进程模式,这种新模式被称为客户模式,主要用来执行客户操作系统代码(至少是一部分代码)。KVM可以运行Windows和Linux虚拟机,每个虚拟机都有专用的虚拟化硬件,包括网卡、硬盘和显卡。虽然,KVM只能运行在Linux上,但它却具有内存管理和可扩展性较好等优点。

 

3 操作系统级虚拟化(例如LXC,VPS)

 

4 编程语言级虚拟化

传统机器通过ISA(Instruction Set Architecture)的支持来执行指令集。正是由于ISA抽象层的存在,使得在机器上运行的操作系统和程序相当于机器上的应用程序。硬件的操作通过专用的I/O指令(I/O映射),或者将一大块的内存分配给I/O,然后再操作内存(内存映射)的方式来进行处理。但无论如何,应用程序最终还是由一系列的指令所组成。随着Java虚拟机(JVM)的到来,使得这种新的实现虚拟机的方式逐渐引起人们的注意。这种抽象层次的虚拟化技术的主要思想是在应用层次上创建一个和其它类型虚拟机行为方式类似的虚拟机,并支持一种新的自定义的指令集(例如JVM中的Java字节码)。这种类型的虚拟机使得用户在运行应用程序的时候就像在真实的物理机器上一样,并且不会对系统的安全造成威胁。像普通的机器一样,它通过安装一个商业的操作系统或利用其自身的环境来为应用程序提供操作环境。这种抽象层次的虚拟化系统主要包括Java虚拟机、Microsoft .NET CLI、Parrot,Python虚拟机等。

举例:Java虚拟机

在Java语言中,其后端实现了一种新的指令集的编译器。正是由于这样的一个后端使得Java成为一种与平台无关的语言,能够在包括Windows、Unix、Mac以及其它流行的操作系统上运行。这个后端又被称为Java虚拟机[Bill Venners, 1996],简称JVM。JVM是一种执行Java字节码(byte code)的虚拟机。这些代码通常由Java编译器生成,需要在JVM上执行的程序必须被编译成由字节码组成的标准的二进制形式,即.class文件。这些二进制文件再由JVM runtime解释执行。除此之外,JVM还为Java字节码提供了一个操作环境,因此,Java平台其实是Java虚拟机和Java操作环境(JRE)的结合。因为JVM最终通过一些底层语言来实现,因此它可以提供比传统机器更好的灵活性。

JVM是一个支持线程的基于堆栈的结构。在JVM中,每个线程都有它自己的程序计数器和虚拟的寄存器集(JVM支持的寄存器)。它支持的指令包括加载/存储、算术、类型转换、对象创建/操作、入栈/出栈、分支、调用和异常处理等等。但是,为了实现Java核心API到主机操作系统之间的映射,并保证其兼容性和高效性,其涉及的内容并不仅仅只是字节码的模拟。

JVM支持4GB内存空间、32位寻址方式和32位虚拟寄存器。其虚拟硬件可以分成四个基本部分:寄存器、堆栈、垃圾回收和方法域。这样的一种虚拟机架构能够对操作进行细粒度控制,并且能够安全执行来自远程的不可信代码,这种模型的典型应用包括Java小应用程序等。这种虚拟化方案具有安全、易调试、平台独立性等几个重要特性。因为所有的硬件设备都在JVM所处层次之下,它能够访问系统所有资源以及虚拟执行通常应用程序所能做的一切事情,因此,Java语言具有和传统语言(比如C和C++)一样强大的功能。

举例:Python虚拟机

        Python先把代码(.py文件)编译成字节码(.pyc文件),交给字节码虚拟机,然后虚拟机会从编译得到的PyCodeObject对象中一条一条执行字节码指令,并在当前的上下文环境中执行这条字节码指令,从而完成程序的执行。Python虚拟机实际上是在模拟操作中执行文件的过程。PyCodeObject对象中包含了字节码指令以及程序的所有静态信息,但没有包含程序运行时的动态信息—执行环境(PyFrameObject)

        字节码在python虚拟机程序里对应的是PyCodeObject对象。从整体上看:OS中执行程序离不开两个概念:进程和线程。python中模拟了这两个概念,模拟进程和线程的分别是PyInterpreterState和PyTreadState。每个PyThreadState都对应着一个帧栈,python虚拟机在多个线程上切换。当python虚拟机开始执行时,它会先进行一些初始化操作,最后进入PyEval_EvalFramEx函数,它的作用是不断读取编译好的字节码,并一条一条执行,类似CPU执行指令的过程。

 

5 程序库级虚拟化

在几乎所有的系统中,应用程序的编写都使用由一组用户级库来调用的API函数集。这些用户级库的设计能够隐藏操作系统的相关底层细节,从而降低普通程序员的软件开发难度。这部分所谈论的例子都工作在操作系统层上,并且创造了一个与众不同的虚拟环境,在底层系统上实现了不同的应用程序二进制接口(ABI)和不同的应用程序编程接口(API)。这种技术能很好的完成ABI/API仿真工作。

 

本文转自:http://blog.sina.com.cn/s/blog_6de3aa8a0102x4i1.html

VPS评审,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权.
转载请注明转自:https://vpsps.com/1552.html
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!