Xen(Paravirtualization)半虚拟化技术.docx
文本预览下载声明
Xen(Paravirtualization)半虚拟化技术 姜 辉Xen3.0之前的系统使用的是半虚拟化技术,相比于vmware全虚拟化技术,其出现在vmware之后,有些资料将其称为继全虚拟化以后的第二代虚拟化技术。本篇文档的结构如下:首先讲述半虚拟化出现的原因,然后从cpu和I/O设备虚拟化方面来讲述xen半虚拟化技术的特点。半虚拟化(Paravirtualization)出现的原因首先回顾一下x86的体系结构,如图1所示,x86将系统特权级分为4级,0层特权级别最高,通常被分配给进行系统管理的软件。在当前的大部分操作系统中,只使用了Ring 0 和Ring 3两个层次。操作系统内核工作在0层,操作系统的应用程序工作在3层,其对硬件和系统资源的访问都要通过调用位于ring 0 的内核服务函数。为了实现系统管理,x86在同一ISA(指令系统集合)下设计了2种指令:用户指令和系统指令。用户指令:可以运行在任何特权级别,用户态应用程序可以直接使用,其主要目的是用来进行计算。系统指令:运行在特权级0,在其它特权级别运行会产生保护异常。1974年Popek和 GoldBerg 在其论文中提出构造高性能虚拟机的一个条件是敏感指令属于特权指令的一个子集。敏感指令是指那些改变系统保护和资源相关寄存的指令,可以对系统的管理产生影响。但是在x86系统中,有17条敏感指令不属于特权指令,现在x86不能构造高性能的虚拟机。图 1 由于以前x86系统中,在硬件上并没有对虚拟化进行支持,采用都是宿主操作系统模式,其结构如图2所示,虚拟机安装在操作系统之上,从用户的角度来看,作为操作系统的一个应用程序。为了进行对虚拟机的管理,则必须改变客户机在x86平台的结构,主要的做法是将客户操作系统内核运行的权限级别进行降低,如运行在ring 1,2,3 。由于特权指令在低特权上运行会产生trap。该trap会被vmm截获并且模拟执行,但是非特权的敏感指令就不同了,它不会引发一个trap,因此对这些指令的处理也是VMM设计时的一个难题。例子:popf指令该指令作用是在内存栈顶弹出一个值,将堆栈指针加2,并将值存储到EFLAGS寄存器的低16位。EFLAGS寄存器中第9位为IF(中断允许标志)。该指令在用户态执行不产生任何效果。在虚拟机中,可能虚拟机的操作系统要使用popf来改变操作系统的状态,但是由于在虚拟机中该操作系统内核工作在非ring 0层,因此其执行popf,对IF标志位不会产生任何影响。在操作系统以后的执行中,会由于这一个执行结果的不一致性产生错误。如果处理不好这些敏感指令,其执行时会使得系统产生异常或者产生预想不到的结果。为了解决这些问题,大部分虚拟机(如vmware)使用了模拟特权指令的方式,即将敏感指令替换成一些其他指令,这些指令可以使得当前状态转到特权状态下,然后由vmm仿真执行,这就是二进制翻译。可以很明显的看出,二进制是比较复杂的,首先需要对当前的执行流进行扫描,如发现特权指令,将其替换为一系列指令。其次,他先扫描,然后替换,最后再转到特权状态下仿真执行,虽然可以采用代码优化,但是仍然极大的降低了性能。为了降低复杂性和提高性能,半虚拟化诞生了。图2半虚拟化技术为了简化全虚拟化的所使用的二进翻译的复杂性并且让虚拟化的性能尽可能的接近本地物理上运行的性能,设计了半虚拟技术化。半虚拟是通过修改目的操作系统,使得虚拟起来更加的高效和方便。这里从cpu虚拟化和I/O设备虚拟化2个方面来描述虚拟化技术。(注:半虚拟化中,将guest os放在ring 1 层)CPU虚拟化通过前面的讨论我们发现,在虚拟化中,通过降低操作系统内核所在的特权级,来达到管理的目的。然后对于那些系统敏感指令的模拟,增加了虚拟机设计的复杂性同时也降低了系统的性能。为了简化虚拟机的设计,和提高虚拟机的性能,半虚拟化技术被设计出来了。在半虚拟化中,其采用的技术是将系统出现的敏感指令替换为对VMM的超级调用,VMM使用的超级调用类似于操作系统中的系统调用(systemcall ,从ring 0 转到 ring 1)。Hypercall 其作用就是将系统从特权级1转到特权级0,然后在特权级0下执行正常的仿真操作。XEN采用了2种技术来解决这些敏感指令执行时的问题。对于那些允许在用户态不产生异常的敏感指令(叫做静悄悄的失败),办法就是采用超级调用的替换,例如,popf,修改需要虚拟机的操作系统源码,使其中出现popf的地方都替换为超级调用。超级调用的在传递参数和返回值方面同系统调用类似,其中断号是int 0x82。对于那些在用户态允许时会产生异常的指令,当起trap到VMM中时,由VMM模拟执行。I/O设备的虚拟化 xen的半虚拟
显示全部