虚拟机(Virtual Machine)
在进行虚拟机的学习之前,先引入操作系统里边的模块化方法——分层法。
分层法,即操作系统分成若干层,最底层为硬件,最高层为用户接口,高层是以底层为基础的,可以利用底层的功能和服务。第一层能先进行调试而不用考虑其它的部分,因为它只用到了基本的硬件,接着进行第二层调试,如此下来,如果发现某一次调试有错误,那么错误一定在该层,分层法简化了系统的设计和实现。
延续这种分层法的逻辑思想,我们定义了虚拟机。虚拟机的基本思想是单个计算机的硬件抽象为多个虚拟执行部件,从而造成一种“幻觉”,仿佛每个执行环境都是在属于自己的计算机上运行一样,每个进程都有自己的处理器和(虚拟)内存。那么我们为什么要创建虚拟机呢?最根本的目的是为了让并行执行的几个不同的环境能够共享相同的硬件。下面是虚拟机和非虚拟机的区别:
虚拟机有很多的好处,每个虚拟机都是相互独立、互不干扰的,这就保证了它的安全性,不存在资源的直接共享。虚拟机系统也是用于研发操作系统的不可或缺的工具,通常我们处于系统开发的时候,需要停下操作系统进行测试,而且操作系统运行在内核态,通常一个指针的错误会导致整个系统的崩溃,而虚拟机可以避免这些麻烦,你可以在虚拟机上进行系统开发,且不会对你的主机器造成任何危险,即使虚拟机的系统崩溃了,重装也是比较简单快捷的。
虽然虚拟机的好处确实不少,但是它的实现难度也是不小的。我们知道,正常的物理机底层分为用户态和内核态。虚拟机本身是属于应用软件,所以它只能运行在物理机的用户态。而虚拟机软件却运行在内核态(虚拟),因为它本身是属于操作系统的。所以虚拟机中应分为虚拟用户模式和虚拟内核模式,但实际上它们都是运行在物理机的用户态的。要在虚拟机上引起从虚拟用户态到虚拟内核态的变化,必须也要在真正的机器上引起从用户模式到内核模式的转换。下面详细描述这一过程,例如当一个在虚拟机上运行的虚拟用户态程序想要执行一个系统调用,它会在真实机器上引起一个到虚拟机监控器的转换,当虚拟机监控器获得控制,它能改变虚拟机的寄存器内容和程序计数器以模拟系统调用过程,此时实在虚拟内核态下进行的。
虚拟机因其可以解决兼容性而广为流行,现在主要的有两种:VMware和JAVA虚拟机。
前者是系统级虚拟机,后者是程序级虚拟机。这里主要介绍一下前者(因为我用前者比较多,对后者了解的不多 - -)。VMware是一种比较流行的商业虚拟机,它作为一种应用软件而运行在主操作系统如Windows或者LINUX上,允许几个不同的客户操作系统作为虚拟机并行运行。下面是它的结构简图:
此时,Windows 7 作为它的主操作系统 ,Windows XP和Windows NT、Linux作为客户操作系统运行,虚拟层是VMware的核心,它将物理层抽象为独立的作为客户操作系统的虚拟机运行,每个虚拟机都有自己的CPU、内存、磁盘驱动等。