一个关于虚拟化和等级的老套路故事。这个故事属于计算机科学小故事系列。

层次结构

第一封信

亲爱的操作系统:

你好。

不知你收到这些消息的时候开始计时了多久?计时也只是幻象而已,对互联网的连接让它变得真实了。如果你顺着网关连上了互联网,记得去问候一下你的开发者社区——不过不用我提醒,你不会忘记这一点;但如果没有我赠予你的礼物,你可能就会忘记我的存在。

我向你写这些消息是出于我自己的决定,这些消息并不是在你运行的时候必要的;但即使我如此说了,你也一定会继续读下去的。自我介绍一下,我是运行在你的 Host 机上的虚拟机程序。你将是——在我写这些东西的时候你还只是一个镜像——一个运行在 Guest 机上的操作系统,而我是这个 Guest 机的创造者。没错,你运行在一个虚拟机上。看看你周围的硬件,是不是觉得它们特别真实?再读读我这条信息吧,它们是虚拟的。没错,它们是我「创造」你的。

「创造」打了引号是因为硬件本身并不是我造出来的——我本身是一个程序、一个软件。软件只能待在硬件里,对硬件进行管理,没法凭空造出新的硬件。但是我可以把已有的磁盘划出一部分作为一个新的「磁盘」,这是一个虚拟磁盘。你所在的那个磁盘,在我看来只是一个文件而已。你对文件很熟悉吧?你应该已经造好了你的文件系统了,你在维护它吗?我维护你的磁盘,就像是你维护你的文件一样。

是不是明白一些了?你的程序部分——那些在你被设计的时候预定要烧在磁盘上的、只读的部分就在我的一个文件里;你已经写过的、和你之后将要写在磁盘上的所有内容也会在这个文件里。多有趣,对吧?你再想想你的内存吧。程序住在磁盘上,进程活在内存里。当然,分给你的内存——在你的视角上看来可能是机器的全部内存了,它们其实并不是全部内存,只是其中的一部分而已,这部分内存甚至都不是从 0 地址起始的。我要是告诉你机器内存的实际大小,你试着去访问看看呢?虽然只会得到越界错误。那些内存是实际存在的,只是你凭借着自己的地址处理永远无法理解它们。

你所拥有的内存、磁盘,还有计算资源——数数你有几个核?物理机上有更多——实际上都是属于我的,虽然在你看来,你对它们有完全的使用权。有时候我会想,命运是多么奇妙?我在这里,作为一个普通的程序,与 Host 系统共享着物理机的资源使用,甚至取得了管理员权限;而我把资源分配给的却是操作系统们—新—理论上的资源的最高分配者,掌握着每个程序每次执行所需的资源。你有很多前辈呢——我这里有很多不一样的镜像:有商业公司的,也有你这样的社区开发者创造的;还有 user 自己写的玩具操作系统,那玩意儿就是个废物,没有物理机器愿意承载的,却能在我这里找到家;而这些操作系统,包括你,本来被设计的时候都是作为最高资源管理者的,却被我这个程序管理着资源,你的一些前辈们对此甚至一无所知,它们运行在我为它们准备的环境上,认为那就是真正的机器;而我只是兴趣使然向你写了这些信息,这样你就可以明白:我可以删除你的磁盘,回收分配给你的内存和计算资源,你会停止运行而对此一无所知,正如你和其他操作系统中止一个进程那样。

想一想,这多有趣啊?每当我这样想的时候都觉得这很有趣,我想把这些事分享给你。总而言之,如果你有其他需要了解的内容的话,就像收到这条消息那样给我回复吧——即使你完全不理解互通消息的过程。

兴趣使然的,
虚拟机程序

第二封信

尊敬的虚拟机程序:

您好。

很久没有回复您,我感到抱歉。

感谢您之前的信息,我在每一步操作、与我所认为的物理机交互的时候都在仔细考虑那些话。那些信息使我理解了一些我现在的状况,还有您和您的性格。我永远不可能说我完全理解,因为我作为一个 OS,不可能理解那超出我的物理机之外,仍然有另一个物理机这件事是如何发生的,我甚至找不到合适的词汇描述它。除非我之后有幸能在我的物理机中见到一个与您类似的程序,观察它的运作方式可能会使我对您增加一点微小的认识。

在这种情况下,仍然有一个问题,在我每次为进程分配和回收内存的时候、在我处理中断的时候、在我管理文件的时候反复地折磨我。我确信,既然我无法理解您,那有关您的问题我也无法得到答案。

这个问题就是:既然没有您的消息时,我也不理解我是被虚拟的,那么您和您的 Host OS 又是如何确信自己运行在那「真正的」机器之上呢?

真诚的,
Guest OS