当我们尝试着去解释虚拟机的概念时,首先必须要理解“虚拟”的概念。“虚拟”这个词最早来源于光学,用于理解镜子里的物体。镜子里的物体是一个实际物理存在的影像,但它不是真正的物体。这意味着这个影像看起来和实际物体一模一样,并且在同一个位置。现在,“虚拟”这个词已经经过演化,用来描述任何真实物体的模拟了,例如:虚拟内存,虚拟磁盘,和虚拟现实。我们在讨论虚拟机的时候,使用“虚拟”这个词,是因为我们希望虚拟机看起来和工作起来,都和真正的机器一模一样。这意味着,虚拟机并不是真正的机器,但是他能像真正的机器一模一样地工作。
现在,在定义虚拟这个词的时候,我们已经使用了“模拟”这个词。模拟就
是那些用来模仿其他事物的事物。模拟在现代应用中的一个非常好的例子,就是空军和海军飞行员的训练。飞行员在飞行模拟器上接受训练:基于计算机的机器,看起来就像是一个喷气式飞机的驾驶舱。这种机器,使得驾驶员不用离开地面,就能感受到和驾驶一架真正的喷气式飞机一样的感觉,并看到同样的东西。这个模拟器模仿了一切,从飞机的实际操作性能,到风和天气条件对正在飞行的飞机的影响。基本上,模拟器使得飞行员在安全的地面,就能够得到所有驾驶一架真正喷气式飞机所能得到的熟练和感觉。
模拟或者模仿另外一个事物的概念被引入到计算机系统的设计当中。尽管虚拟机有许多化身,但是,从他最本质的层面讲,一个虚拟机是一个并不实际存在的机器的的表象。这当然最笼统,也是非常不清楚的定义。但是先和我们一起忍受一下。
现在,让我们考虑一下一个机器最一般的概念。所有的机器,不管是电冰箱,录像机,还是计算机,都有一个共同点:它们被设计用来完成一组特定的指令。这些指令组成一个指令集。任何一个机器的指令集,都可以被想象成一个装有Lego(垒高拼装玩具)的盒子。这些Lego被放在一起,组成一个整体。对于机器来讲,这些Lego就是指令,他们被用来告诉机器做什么,以及完成什么任务。
对于虚拟机来讲,“虚拟”实际上就是指的这些指令集。虚拟机有许多不同的类型,但是它们有一个共同的主题就是模拟一个指令集的概念。每个虚拟机都有一个用户可以访问的指令集。虚拟机把这些虚拟指令“映射”到计算机的实际指令集。这种映射关系,如图1.1所示:
在虚拟机领域,主要有四种不同的思想流派。第一种以IBM虚拟机模型为代表,它几乎是一种一一映射。第二种流派由机器中每条指令和一个虚拟指令间的映射组成,它以Java虚拟机为代表。UNIX虚拟机模型和OSI虚拟机模型代表着最后两种模型。我们在后面会讲到这些模型。这两种模型直接映射一部分指令,而其它的指令则是对操作系统函数的直接调用。