虚拟机运行虚拟机操作系统和模拟器模拟运行的关系有点像操作系统调用程序和解释器解释脚本的关系。只要稍微想象下也不难理解,模拟器根本不可能像虚拟机那样达到物理机80%的性能运行程序一样。“新版”虚拟机要求硬件支持很大程度上是噱头,一个很可笑的事实是,在Win7 XP Mode推出一年后,因为厂家的抱怨,Microsoft做出妥协,允许让非硬件虚拟化支持的CPU也可以运行——事实上性能几乎是一样的。这说明是否支持硬件虚拟化,对虚拟机的实现来说是无关紧要的事情。vmware就不强制这样的支持。“新版”虚拟机还有一个很重要的改进就是,它支持操作系统的“启蒙”,为了解释这一点,我们需要说说在没有硬件虚拟化支持和操作系统启蒙的系统上虚拟机是怎么工作的。它的原理其实很简单,就是拦截操作系统的那些“顶级调用”,让它们在沙箱中运行——这一点和hook api没有什么不同,只是更加底层。这些“顶级调用”就是那些特权指令。虚拟机监控程序会驻留在特权层,捕获来自虚拟机操作系统的调用,并且处理,保证各个虚拟机的独立性。而虚拟机启蒙就是,虚拟机直接替换掉操作系统内核(对于微软Windows+Hyper-V来说,你可以说是Windows为虚拟化优化了,因为它们是一家搞出来的)。被“启蒙”的操作系统不需要再次拦截系统调用,相反,它自己就能够向它更高层的API做出区隔。显而易见的是,它更节约内存和提高性能。一个启蒙的操作系统上运行虚拟机,更接近单一操作系统多个用户的运作模式(而不是在虚拟机管理器上运行了多个操作系统)。这种模式也叫做“多租户”模式。
你理解错了。“新版”只是支持了对硬件虚拟化的支持。所谓硬件虚拟化,主要是增加硬件的虚拟机监控特权级别,以及对虚拟化内存的管理。判断虚拟还是模拟其实很简单。以下是它们的对比:
虚拟化无法多层嵌套,也就是虚拟机内再运行虚拟机,模拟器可以。
虚拟化无法实现异构环境,比如arm上的虚拟机无法运行x86程序,反之也是,模拟器可以,所以你能看到用模拟器让非x86的手机运行win95。
虚拟化中,你用cpu检测软件看,看到的是host的cpu型号,模拟器可以是任意型号——事实上,在bochs中,有一个叫cpuid的源代码文件,就是模拟cpuid指令的,你可以随意修改cpu型号字符串。
虚拟化性能远远超过模拟器,虚拟化的性能大约和主机在同一数量级上,好的模拟器低1~2数量级。
虚拟化中CPU特性不能超过物理CPU特性。你不能在PIII上通过VMware模拟sse3,模拟器可以。
开源的虚拟机代码不是很多,xen是一个,你不能在其中找到对cpu指令的模拟,但是你看bochs完全是和cpu对应的,cpu有什么指令,就能看到软件的实现,这是显而易见的。
没有一种模拟器需要硬件虚拟化支持——也就是模拟器不能从硬件的虚拟化中得到收益。
虚拟机在实现上有两种类型,一种主要使用原生代码,象VMWare、VirtualPC、VirtualBox,优点是运行速度快,缺点是要求原生硬件;另一种是解释执行的,象DosBox、qemu,速度慢,但是不要求被运行的环境所要求的硬件条件,比如DosBox可以在基于ARM的手机上运行DOS游戏,qemu能在龙芯3机器上运行win2000。
Emulator应该是Virtual Machine的一种,无论如何它符合虚拟机的定义,Simulator则是另外一回事了,就象沙盘推演和实战的区别。
DosBox(虽然叫DosBox,其实是可以运行win3.x和win9x的),开源的。