英特尔CPU虚拟化技术(VT)浅谈

互联网 | 编辑: 杨雪姣 2009-08-03 00:00:00转载 返回原文

第一页

在IDF春季论坛上,Intel向人们展示了代号为“Vanderpool”的虚拟化技术。这项技术将运用在Intel今年迟些时候推出的桌面CPU、64位ItaniumCPU以及明年推出Xeon服务器芯片和移动CPU上,届时Intel的CPU将拥有硬件层次的虚拟化技术。

提到虚拟化技术,大家并不陌生。这项技术在传统的大型机和Unix系统上早已是很普及了,但因为桌面CPU大都使用的是X86架构,这决定了在其之上使用硬件级虚拟化技术的难度。Intel可谓创造先河,誓将该技术运用到桌面级产品上,用以提高CPU的性能和降低系统组建开销。这也在一定程度上符合Intel目前的策略,不再一味追求CPU的速度,而把焦点集中在CPU的效率上来。本文就将为读者详细介绍Vanderpool Technology技术(以下简称VT),它是什么、做些什么事、存在的问题及解决方法,还有在技术层面上它是如何运作的。

一、什么是虚拟化?它给我们带来什么?

虚拟化能使用户在一台服务器上同时运行多个操作系统,这与“多重任务处理”技术有些类似。不过“多重任务处理”技术只允许用户在同一机器设备的同一操作系统中运行多个程序,而虚拟化则可让用户在同一机器设备中运行多个操作系统。这样用户能更灵活高效地配用计算机资源,并且有助于提高安全性能。

想象一下,一个操作系统几乎不需花任何时间就可被启动,即使它崩溃了,你只需简单地将它剔除出去,同时立即装载一个新的。如果你正在同时运行几个操作系统,当你准备给其中一个载入新的映像时,你可马上将它关闭,并把该系统正在处理的工作分流给其他系统运行。如果你有5个RedHat的副本正在运行Apache服务器软件,而其中一个因满负荷而停止响应,没问题,你只需简单地将响应请求转交给其他4个系统处理,同时重启那个停止工作的系统就行了。

如果你已为你正在运行的操作系统存储了一份“快照”,那么每当有一些不愉快的事情发生时你都可重新启动它,例如被黑客攻击、感染病毒。从一个安全的分区载入映像并修复好它就行了。虚拟化还可让用户毫不费时地重新安装操作系统而不需像以往使用Ghost那样去安装设备驱动。你可简单地就像使用普通程序那样去载入、卸载和存储操作系统。

同样,它也允许你在同一台机器上使用多个不同的操作系统。如果你是一名程序员,需要编写代码使它们在Windows 95/98/Me/2000/XP上都能运行,你可在你的办公桌上准备5台机器或是1台运行了5种虚拟化操作系统的电脑。同时,作为程序员的你需在每个浏览器的每个版本上校验这些代码,很明显微软不会让你在一个已拥有高版本IE的情况下去安装更低版本的IE去做这些事,但你可一个个地安装旧的操作系统或采取更好一些的解决方法——让它们同时运行。

二、现有虚拟化技术及缺陷

是不是一切都很简单和完美?然而在虚拟化世界并非一切都是尽善尽美的。最显而易见的就是那么多的副本操作系统(上面例子中的操作系统副本多吗?你可以想象一个网络主机公司,20个、50个都是有可能的)同时运行在一台计算机上需要占据很多的资源并导致更昂贵的服务器开销。数据传输在任何情况下都变得更难,因为越多东西被载入,需要的存储器容量也就越多。

是的,真正的杀手就是系统开销。目前在计算机虚拟化方面有几项技术,但它们都伴有不同程度降低系统性能方面的问题。单就CPU而言,其占用率可以从10%到超过40%。

很显然,我们需要新的技术来解决这些问题。Intel所要采用的VT技术背后的思想就是降低虚拟化时的系统开销。在我们深入了解它如何工作之前,我们有必要了解一下虚拟化技术到底是如何实现不同的操作系统工作在同一CPU上的。

目前主要存在有3种类型的虚拟化技术:Paravirtualisation、二元码转译和模拟器。大家最为熟悉可能就是模拟器了。你可以让一个超级任天堂的模拟器在Windows XP的一个窗口中运行,同时还可有另一个PS模拟器。这些都可看作是虚拟化的最基本形式。模拟器需耗费巨大的CPU开销,如果你非要去模拟硬件装置的每一个Bit位,你将花费大量的时间和精力。比较好的方法是跳过其中的某些部分,我们使用的模拟器就是这样,它工作得也还过的去。

这个领域的另一端就是目前较流行的并被业界认可的“Paravirtualisation”(以下简称PV)技术。按字面意思理解,是编程序模拟的意思。它让主机操作系统知道它们正工作在一个虚拟化的环境中,通过修改它们以使之工作得更好。因此操作系统需针对这种方法进行修改和调整,它们必须来回于操作系统的编写人员和编写虚拟化软件人员之间。从这个角度来看,它并非是完全的虚拟化,因为存在这种合作的关系。

PV技术在开源代码的操作系统中工作得不错,Linux,、xBSD都是很合适的PV工作平台的候选者,你可在这些系统中任意调整所需调整的地方,使PV能工作得更好。而Windows则不行,这大概能解释最近为什么众多IT巨头吹捧开源虚拟化技术Xen了。

而“二元码转译”(以下简称BT)技术可说是较折衷的方法了。它所要做的取决于操作系统将要做些什么,并在不知不觉中改变它。假如操作系统试图去执行指令A,但该指令A会给虚拟化引擎带来某些问题,那么BT将把它转换成某些更合适的指令并伪造指令A应该返回的结果。这是一项欺骗工作,且占用大量CPU资源,另外用许多代码取代一条代码也不会使事情运作得快些。

当你了解这些后,你会感到头痛。纯粹致命的缺陷的确没有,但都没有一个简单的解决方案。这些虚拟化的技术仍在继续运用,只是人们都在尽量使其处在一个较低程度的缺陷范围内工作罢了。是什么造成这样的呢?

三、什么问题困扰着我们?

对于X86系统架构的CPU而言,至少在32位领域,有太多让人头痛的条条框框,但作为一条总则,它们都包含有环转换器(Ring Transitions)和有关指令。从概念意义上说,环是一种划分系统特权级别的方法(因此“Ring”也称作特权环)。你可让操作系统运行在一个特权级别上而不会使之被用户程序更改。这样即使你的程序出了问题,它也不会导致系统崩溃,而操作系统能取得控制权,关闭出毛病的程序。这些环强行控制系统的不同部分。

Intel公司的X86系列CPU(包括80386、80486、Pentium、Pentium Pro、Pentium Ⅱ、Pentium Ⅲ以及现在的Pentium 4CPU),提供4个特权级别R0、R1、R2和R3。较大的数字表示较低的特权,我们可简单理解为运行在某一级别的程序无法改变运行在较小数字级别上的程序,但较低数字级别上的程序可干扰甚至控制运行在较高数字级别的程序。

在实际运用中,被经常用到的只有R0和R3,即最高级别和最低级别。操作系统运行在R0上,而用户程序运行在R3上。X86架构在向64位扩展时,采用的方法之一就是通过去掉中间的特权级别——R1和R2。几乎没有人注意到它们消失了,除了那些使用虚拟化技术的特定人群。

像VMware这类软件模式的虚拟化机(Virtual Machines,以下简称VM)显然必须运行在R0级别上,但如它们要想保持完全控制权,就必须使操作系统在这个级别之外。最显而易见的解决办法是强迫主机操作系统运行在一个较低级别的环中,如R1。它们的部分代码原先被设定为从R0到R3,而不是R1到R3。虽然在PV环境中,你能修改操作系统从而使它工作得很好,但如果你要找到一个圆满的解决方法,就必须使操作系统工作在R1级别中。

可如此一来又出现问题了,有些指令只有当它们从R0级里发出或发往R0级时才会工作,如果不在正确的环中,这些指令会运作得很古怪。如果你试图这么去做,会有很不好的后果。让代码在正确的环中执行确实能防止操作系统破坏VM,同时也防止运行在主机操作系统上的软件破坏操作系统自身。这就是所谓的“0/1/3”模式。

还有一种模式被称为“0/3”模式。这种模式将VM放入R0级别中运行,而将操作系统和用户程序都放入R3级别中。但从本质上而言,它还是像“0/1/3”模式一样去处理其他事情。在R3级别里,有特权的操作系统能更轻松地执行用户程序,由于不存在环的阻隔,也使它运行的更快一些,但系统稳定性不佳。

另外一个方式去使用“0/3”模式,就是让CPU保有两份运行于R0级别中的事物的页表。一份为操作系统,另一份为运行在R3级别中的老程序。这样可拥有一份完整的存储器保护集,用来把用户程序隔离到操作系统空间之外。当然,这同样需要消耗性能,只是以不同的方式罢了。

概括来说,在“0/1/3”模式中,系统安全性更高一些,但从R3到R1、R3到R0或R1到R0转换时性能会受到一些影响,反过来也是。在“0/3”模式中,只存在R0与R3之间的转换,所以它潜在的比一个非主机操作系统运行得更快一些。但如你碰到一个问题,“0/3”模式比“0/1/3”模式更容易出现蓝屏。尽管未来将广泛使用“0/3”模式,主要是因为上文我们提到向在64位扩展时已去掉了R1和R2,所以你必须被迫使用“0/3”模式。对计算机而言,这被称作是进步,同样,毁灭性的崩溃被认为是“古怪”行为。

第二页

理论上,如果你可忍受一点不稳定性,或者在“0/1/3”模式中牺牲一点速度,那么应该说的很完美的。可它们在某些方面确实还存在一些缺陷,主要存在以下4点。首先是那些检验指令自己所在环的指令,另外是那些处在错误的环中却没有正确保护CPU现场的指令。最后两点是截然相反的,就是那些应引发错误却没有导致错误的指令,以及那些本不该导致错误却引发许多错误的指令。所有这些都让编写VM的天才程序员们活得不轻松。

其中第一点是显而易见的。如果你给予操作系统R1级别的特权,当它检验自己运行所处的环时,它会返回1而不是0。如果此时运行于该系统的一段程序期望自己应该处在R0环时,那么它会因为得到的是R1而导致错误。这会导致蓝屏的出现,存储器清除或另一些不理想的后果。二元码转译技术可捕捉到这种错误,并把返回值伪装成0,但这意味着需要几十上百条指令来完成这一工作,显然速度受到极大影响。

保护现场是一个潜在的更糟糕的问题,有些CPU里的东西在上下文开关程序中并不是很容易被保存的。那些隐藏的段寄存器状态就是一个很好的例子。一旦它们被载入主存,其中一部分无法被保存,导致内存常驻部分和CPU中实际值间的不同而引起意外中断。当然我们可为它们设立工作区,但这样做极为复杂且需付出很高的代价使之表现得聪明一些。

那些本该引起某些问题却没有导致这些问题的指令也是摆在我们眼前的一道难题。如果你期望一条指令应在你后面的设计的中断陷阱中造成错误,但却没有,这一点也不会让人因为没有错误而高兴。与此相反的情况也极为常见,如果不在正确的环中向CR0和CR4写入,则会产生错误,导致系统崩溃。虽然这两种错误在你不注意时可被修正,但却造成很多性能损失。

整个所涉及到的虚拟化技术就是要将操作系统放在一个它本不应该在的地方,不断地运转去尝试解决所有扑来的问题。存在许多问题,这些问题也不断的发生,所以性能损失也就没什么奇怪的了。

四、解决之道

Intel的VT技术能解决这些困扰。VT的目的是在尽可能最小化程序员痛苦的同时尽可能多的增加“virtualization holes”(虚拟化孔)。这种解决方案中,VT-X针对X86而VT-i针对Itanium,分别引入了一种新的模式针对不同的CPU。这里我们主要来看看VT-X,实际上VT-i的功能与VT-X有很多相同的地方。

这种新的模式被称为VMX,并且引入了一个虚拟化机监控器VMM运行于其中。它被设定在R0级别下,你可以认为是R-1级或者看成是在环的旁边运行。主机操作系统和所有的程序在VMX模式中运行,与此同时VMM运行在VMX根模式中。

任何一个运行在VMX模式下的操作系统,都拥有所有运行于非VT系统中的一般操作系统的功能和特性。它也处在R0级别中,与平常一样有权利处理每一件事情,而且并不知道有什么东西正在它的旁边运行。当情况得到授权,CPU进入VMX根模式,VMM就可以切换到其他一个运行在另一VMX实例的操作系统。这些切换被称做VM登录和VM退出。

VT技术所表现出来的不可思议的地方就在于它将从VMX模式到VMX根模式(或从VMX根模式到VMX模式)的登录和退出处理易于操作。一旦主机操作系统被涉及到,那它一定是独自处在自己的世界里的,你必须保存虚拟化世界的完整状态并当你返回时重新载入它。虽然在VT里还有很多事物要去处理,但它被设计为一项任务,所以客观地说它实际是一个简单而并不费力的进程。

因为每一个操作系统实例都在正确的位置运行,所以前面所提到的4个问题也就不存在了。相关联的工作区也不再需要,与此有关的系统开销没有了。这些能有效提高速度。但这些并非免费,只是付出的代价要少很多。

启动一个新的主机操作系统,你需为其留出一块4kB的存储区并将它传递给一个VMPTLRD指令。这块区域将用来存储该系统实例不被激活时的所有状态和重要Bit位。只要该操作系统实例存在,则这块区域一直有效,直到在其上运行一条VMCLEAR指令。这样就设立了一个虚拟化机实例。

如果你想要把控制权交给虚拟化机,你要么登录VMX非根模式或简单一点,运行VMX模式即可。这些提到的VM登录指令就是VMLAUNCH和VMRESUME,两者并没有太大的区别。VMRESUME指令只是简单地从刚开始已经初始化的4kB存储区里载入CPU状态,并把控制权交给主机操作系统。VMLAUNCH做的也是同样的工作,但它会启动一个虚拟化机控制构件VMCS,它包含一些设立VM的现场背后的记录,因为这需花费一些时间,所以人们尽量避免在并发登录时使用VMLAUNCH。

从这一点来看,主机操作系统开始了它的愉快之旅,尽可能地运转,毫无察觉是否有其他东西正在它的一旁运行。正如过去所计划的一样,它存在于自己的世界里,全速运行,或接近全速。唯一的问题是你如何打破这一切美好的景象而将它关闭到一边,以使得机器里的其他操作系统能真正运行。这就是VT技术所体现出来的复杂的一面——VMCS中一些特别的位映像。

这些位映像是一些32位的字段,每一个Bit位标志一个事件。如果某个事件被触发,则对应的Bit位被置位,CPU触发一条VM退出指令,并将控制权返还给运行在VMX根模式下的VMM。VMM可做任何想做的事,然后将VMRESUME指令传递给下一个操作系统,或刚离开的那个操作系统。这个被启动的操作系统同样很好地运行着,直到触发另一条VM退出指令。如此这样以每秒上千次的速度重复着。

什么能触发这些指令呢?它们可以是引脚信号、CPU、异常和页面错误这些平台事件,所有这些都会触发VM退出指令。VT技术的完美之处在于它有很强的适应性,另一个与此类似之处就是在调试程序中设置断点,你可在每个事件上都设置一个,或者一个也不设置,这都取决于你自己。

引脚信号事件要做的是当有一个内部中断或一个不可屏蔽中断发生时,则触发退出指令。而CPU事件,则是当你设置任意Bit位在某一字段,当相应的CPU状态接收到它时,则触发退出指令。虽然大多数指令需要去设置,但也有一些指令无条件地引发VM退出指令。这是在一个非常细小的层面上控制VM,允许每当你需要时登录和退出。

异常位映像也是一些32位的字段,每个Bit位标志每个32位指令地址的异常情况。如果Bit位被设定并有一个异常被抛出,它就会引发VM退出指令。如果Bit位是空的或没有异常,那么主机操作系统则继续它的快乐之旅,与平常一样。这是一种从VMX模式退出而进入VMX根模式的系统开销非常低的方法。

最后还有页面错误退出,它与异常退出十分相像,只不过它用两个32位字段来控制。这些字段内的Bit位对每一个可能出问题的页面错误代码进行映像,因此你可细心地从中挑选从哪里退出。同样,它也是基于很细小的层面,系统开销也很低。

在计算机里,VT工作在一个比传统的R0环更有特权的级别中。任何一个主机操作系统都可在没有改变的旧有架构下运行,并且不知道一个控制程序在控制它们。当遭遇到某些用户设置的触发器,控制权将被转交给运行在更高级别的VMX根模式上的VMM。因为这是一种被动触发事件,而不需被积极监视,因此系统开销降到了最低限。

VT技术使得安装和卸载那些比以往VM模式更稳定的运行环境变得简单。如果你需运行虚拟化系统,没有理由不用一个拥有Vanderpool功能的CPU去实现它,而软件虚拟化机会逐渐不被人关注。

这也许不错,但必须记得,这必须付出代价。每一次登录意味着建立4kB的存储区域,每一次退出要向这4kB存储区内写入数据。这看上去有些耗费过多,可与那些较老的方式比较,它的速度惊人地快。

总结

Intel的VT技术给人们带来了惊喜,它让我们可在硬件级别上完成计算机的虚拟化工作。目前时机成熟了,Intel将首先在其桌面CPU中引入该技术,最新的Pentium 4 6系列CPU就支持VT,这让更多的用户都能涉足到新技术的应用,大大提高了用户使用CPU的效率,编写VMM不再那么困难了。

不过我们也要清醒地认识到,现有的虚拟化技术不会马上消失,相反它们会变得更为普遍且系统开销问题也正得到改善,而大型服务器提供商们也不会在现有的技术上发生巨大的变化,毕竟目前还用得过去。加上AMD公司也发布了在其64位CPU上使用Pacifica虚拟化技术,因此VT想要取代现有的计算机虚拟化技术或得到人们的认同还需一段时间。可我们相信硬件级别的虚拟化技术毋庸置疑的是未来计算机发展的方向,有着灿烂的前途。

返回原文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑