一、关于虚拟机技术的背景知识
1
、Emulator
和Virtualizer
的区别
现在很多杀毒软件里面有所谓的智能脱壳功能,其实它就是用一个Emulator模拟器来解释执行机器指令,比如说x86的机器语言是一条一条来被翻译执行的。而Virtualizer并不是由软件来模拟执行,而是使这个代码尽可能自然地在当前的处理器上运行,而虚拟机监控器只需要在某些特定时候进行干预,比如说来处理一些特权指令操作。
Emulator中比较有名的一个是BOCHS,可能有一些朋友用它来进行过一些操作系统级的调试。这是一个开源的软件,在网上可以下载到。
Virtualizer比较有代表性的是VMware、VPC这些软件。
VMM是虚拟机管理器,也叫做虚拟机监控器,其实它就是一个软件层。这个软件层是在被虚拟执行的操作系统和真实的硬件环境间由软件构架的一套中间层,由它来负责对下面的硬件,比如CPU处理器、硬件等进行虚拟。我们后面还会看到对VMM的结构和工作原理的介绍。
2
、Host OS
和Guest OS
Host OS和Guest OS非常好理解,在虚拟机里运行的系统,我们称之为客操作系统。对于二型VMM架构它的主操作系统,我们叫做Host OS。
3
、VMM
的类型
下面我们介绍一下VMM的类型,有两种:一种是在裸机上的架构,第二种是混合型,就是有主操作系统的VMM,典型代表有:
- Type I VMM(Bare Metal):VMware ESX, Xen, MS Hyper-V
- Type II VMM(Hosted/Hybrid):VMware Workstation, MS VPC
图1描述的是I型VMM的结构。我们可以看到虚拟机监控器VMM是装在裸机上的,在这个上面我们会有多个并发运行的客操作系统Guest OS。
![](http://www.sinoit.org.cn/NewsLetter/NO.2/images/20080204_clip_image002.gif)
图1 I型VMM结构图
对于有Host OS的II型VMM是图2这样的,虚拟机软件本身是Host OS的一部分,通过虚拟机软件,使VMM和Guest OS运行在同一个线性地址空间里来虚拟Guest OS的执行。另外VMM还有一个功能,从主操作系统的上下文空间向客操作系统的上下文空间进行切换,由它进行控制。
![](http://www.sinoit.org.cn/NewsLetter/NO.2/images/20080204_clip_image004.gif)
图2 II型VMM结构图
我们原先用到虚拟机的技术,多半都是由纯软件来实现的,因为我们在硬件上没有对虚拟的直接的支持。用软件来实现虚拟,是非常困难,而且非常非常有技巧的一件事情。可能用过VMware的朋友都有一个疑问,它到底是怎么实现的?怎么来同时运行两个操作系统?VMware在里面的操作系统运行在一个Windows窗口里面,外部的操作系统也在并发执行,怎么做到的?其实这用到了很多比较复杂的技术,包括所谓的执行特权级压缩。也就是说,在窗口里运行的客操作系统的内核模式,实际上不是在ring0执行的,而是被降级到ring1执行的。这样就能保证它里面发出的一些特权指令的调用可以被虚拟机监控器所捕获到,来进行模拟。而它里面用户态的代码是自然在CPU上执行的,这就是为什么执行的效率相比起其他的一些模拟器来说我们会觉得比较快,因为它大部分的指令全是在CPU上自然执行,不需要虚拟机监控器来进行干预。
但是由于x86这个体系本身对于虚拟来说有一些不支持的地方,比如一些敏感的但是不可捕获的指令,比如说像SIDT这条指令,即便在ring3下执行也不能产生异常,VMM抓不到它,这对虚拟来说是一个挑战。所以VMM对于Guest OS的ring0采取的是二进制翻译,而对ring3采取的是直接执行。下面这条是为了对付这种敏感但是不可虚拟的指令,而采用的二进制翻译的机制。
4、用软件来实现MMU
还有一个比较关键的技术,就是所谓的用软件来实现MMU(内存管理单元),影子页表。在图2所示的II型VMM里面,客操作系统认为自己是独占线性地址空间,而且觉得这个物理内存全部是它的。但是我们可以看到,VMM是跟它运行在同一个线性空间里,而且只是划分了一部分物理内存给它使用,所以必须使用软件虚拟MMU的方法来使它认为自己好像是独占这个空间的。
Guest OS有自己的页表,但是这个页表不能被硬件直接使用,而硬件的页表是由VMM控制的。Guest OS自己的页表和实际的硬件设置之间有一个对应关系,这种对应关系是由VMM来维护的。
由于软件虚拟技术比较复杂,而且效率比较低,所以近几年处理器直接加入了对虚拟的支持,即所谓的硬件虚拟。我们可以看到,Intel和AMD都有所动作,Intel的叫做VT-x,AMD的叫做SVM技术。当然后面还有一些别的后续技术,比如说VT-d和IOMMU。
转载于:https://blog.51cto.com/broadviewsec/125260