预计阅读本页时间:-
8.3.3 II型管理程序
当采用VT技术的时候,建立一个虚拟机系统相对比较直接,但是在VT技术出现之前,人们是怎么做的呢?很明显,在一台虚拟机上运行完整的操作系统是不可行的,因为(一些)敏感指令会被忽略掉,从而导致系统崩溃。于是人们发明了称为II型管理程序的替代品,如图1-29b所示。最早的一代产品是VMware(Adams和Agesen,2006;以及Waldspurger,2002),它是斯坦福大学(Bugnion等人,1997)DISCO研究项目的发展成果。VMware在Windows或Linux的宿主操作系统上作为普通用户程序运行。当它第一次运行的时候,它就像是一个新启动的计算机,试图在光驱中寻找含有操作系统的光盘。然后通过运行光盘上的安装程序,在它的虚拟磁盘(实际上就是Windows或Linux文件)上安装操作系统。一旦在虚拟磁盘上安装好了客户操作系统,虚拟机就可以运行了。
现在让我们来仔细研究VMware是如何工作的。当运行一个Pentium二进制文件的时候,这个二进制文件可能来自于安装光盘或虚拟磁盘,VMware首先浏览代码段以寻找基本块(basic block)。所谓基本块,是指以jump指令、call指令、trap指令或其他改变控制流的指令结束的可顺序运行的指令序列。根据定义,除了基本块的最后一条指令,基本块内不会含有其他改变程序计数器的指令。检查基本块是为了找出该基本块中是否含有敏感指令(见Popek和Goldberg的论述)。如果基本块中含有敏感指令,每条敏感指令被替换成处理相应情况的VMware过程调用。基本块的最后一条指令也被VMware的过程调用所替代。
上述操作完成之后,基本块在VMware中缓存并执行。在VMware中,不含任何敏感指令基本块的运行与它在裸机上的运行完全相同——因为它就是在裸机上运行的。通过这种方式找出、仿真敏感指令。这种技术称为二进制翻译(binary translation)。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
基本块执行结束之后,控制返回到VMware,它会定位下一个基本块的位置。如果下一个基本块已经翻译完毕,它就可以被立刻执行。如果还没有翻译完毕,那么依次进行翻译、缓存、执行。最后,大多数程序被缓存并且接近全速的执行。很多优化方法得到了运用,例如,如果一个基本块跳转或调用另一个基本块,最后一条指令被一条跳转或调用已翻译好的基本块的指令所代替,从而节省了寻找后续基本块的开销。同样,在用户程序中不需要替换掉敏感指令;因为硬件会直接忽略它们。
讲到这里,即使在不可虚拟化的硬件上,II型管理程序也能正常工作的原因就已经很清楚了:所有的敏感指令被仿真这些指令的过程调用所替代。客户操作系统发射的敏感指令不会被真正的硬件执行。它们转换成了对管理程序的调用,而这些调用仿真了那些敏感指令。
有人可能会天真地认为支持VT技术的处理器在性能上会胜过II型管理程序所使用的软件技术,但是测量结果显示情况并不是这么简单(Adams和Agesen,2006)。其结果显示,支持VT技术的硬件使用陷入——仿真的方法会引起太多的陷入,而在现代硬件上,陷入的代价是非常昂贵的,它们会清空处理器内的缓存、TLB和分支预测表。相反,当可执行程序中的敏感指令被VMware过程调用所替代,就不会招致这些切换开销。正如Adams和Agesen所指出的,根据工作负载的不同,软件有的时候会击败硬件。由于这个原因,一些I型管理程序出于对性能的考虑会进行二进制翻译,尽管即使不进行转换,运行于其上的软件也可以正确运行。