本文首发于微信公众号:GTOC 总结了「虚拟机系统与进程的通用平台」一书中,关于虚拟机导论的内容。
一、抽象层次。
管理计算机系统复杂性的经典手段,是通过一些定义明确的接口,把系统划分成不同的抽象层次。不同的抽象层次,分工明确,一般越靠近底层的,越关注硬件实现;越靠近上层的,越关注业务实现。
同时,抽象层次允许忽略或简化系统设计的底层实现细节,从而简化高层组件的设计。
一个典型的例子是,操作系统对硬盘的抽象。
硬盘被划分为不同的磁道和扇区,它的细节经过操作系统的抽象(文件系统+硬盘驱动),使应用程序看到的硬盘,是不同大小的文件集合。
上层应用程序可以创建、读、写文件,但不需要关注硬盘具体由什么构造和实现的。
明确的接口可以分解计算机的设计任务,使得硬件和软件设计,能够或多或少地独立开展工作。
指令集(ISA)就是这样一个接口。
举个例子,硬件团队设计了一款基于 RISC-V 指令集的处理器,编译器团队开发了一个将高级语言编译成该指令集的编译器,只要双方能够遵从该指令集的规范定义,编译出来的软件,就可以正确地在这个处理器上执行。
计算机系统中另一个重要的标准化接口,是操作系统接口,它被定义为一组函数调用的集合。
应用开发者不需要关注操作系统的内部实现,只需要遵从操作系统接口的约束即可开发自己的应用程序,这使得软硬件可以独立开发演进和升级。
但定义明确的接口也有局限性,为不同规范设计的子系统或者组件,难以复用和协调协同工作,常见的是特定操作系统与指令集的相互绑定。
一旦应用程序以二进制形式分发,便很难在按照不同指令集规范设计的硬件平台上运行。
而在硬件/软件接口之下,硬件资源也会限制软件系统的灵活性。
例如为单处理器或者存储共享的多处理器开发的操作系统,往往被设计成能直接管理硬件资源的方式。
这种情况下,系统的硬件资源受单一的操作系统管理,这又反过来限制了系统的灵活性,比如,对上层应用软件的限制。
特别是,在多用户或用户组共享的场景下,出于安全性和故障隔离方便的考虑,会进一步限制系统的灵活性。
二、从接口的角度谈虚拟化。
虚拟化提供了一种放宽前述的限制,增加灵活性的方法。尤其是在资源利用、资源隔离、安全性方面提供更多的保证。
当一个系统(或子系统),例如处理器、存储器或输入/输出设备被虚拟化,它的接口和所有通过接口可见的资源,都被映射到实现它的真实系统的接口和资源上。
形式上,虚拟化将一个真实的主机系统虚拟成多个不同的客户机系统,客户机系统与主机系统具有相同的实现细节,这是与抽象最大的不同。
虚拟化不需要隐藏实现细节。
我们再看一个虚拟盘的案例,来体会虚拟化是如何在同一抽象层提供不同的接口或者资源的。
有些应用中需要将一个完整的大硬盘,分成许多小的虚拟盘。
虚拟盘软件利用操作系统提供的文件抽象作为中间步,将每个虚拟盘都映射为真实盘的上的一个大文件。
每个虚拟盘表面上都包含一些逻辑磁道和扇区(虽然容量比大硬盘中的少,但细节上别无二致),对虚拟盘的读写操作被映射为,在主机系统中对文件的读写操作,进而到对相应的真实盘的读写操作。
三、从虚拟化到虚拟机。
虚拟化的概念不仅可以用于某个子系统,也可以用于整台机器(Machine)。
虚拟机(Virtual Machine,VM),通过在真实机器上增加一层软件来支持所需实现的虚拟机体系结构。
例如大家熟知的 VMWare ,可以在上面运行不同的操作系统,与宿主机共享硬件资源。
通常,虚拟机可以绕开真实机器的兼容性限制和对硬件资源的限制,从而获得更高的软件可移植性和灵活性。
虚拟机的应用场景非常丰富,比如多拷贝虚拟机可以在一个硬件平台上为个人或者用户组提供他们需要的操作系统环境,并且提供资源隔离和保障安全性方面的能力。
一个大型的多处理器服务器,也可以被划分为多个虚拟服务器,并对服务器资源管理提供动态平衡。
虚拟机也可以利用仿真技术提供跨平台的软件兼容性。
例如一个实现了 x86 指令集的平台,可以被转换成一个可运行 RISC-V 指令集的虚拟平台。
这种兼容性既可以在系统级实现(利用 QEMU 全系统模拟的能力,运行 Windows / Linux 系统),也可以在程序或者进程级提供(利用 QEMU 用户态模拟,运行 WPS 应用程序或某些游戏)。
除了仿真,虚拟机还可提供动态、在线的二进制程序优化。
最后,通过仿真,虚拟机还可以在支持现有的标准指令集的程序的同时,实现新的私有指令集,如超长指令字(Very Long Instruction Words,VLIWs)。
除了为真实机器提供虚拟化能力,虚拟机在高级语言的跨平台方面的应用也很普遍。
用这种高级语言编写的程序,被事先编译成针对虚拟机的二进制代码,然后任何实现这个虚拟机的真实机器,都可以运行已编译好的代码。比如 Java 的 JVM,再比如 Python 的 PVM 等。
四、结语。
操作系统开发人员、语言设计人员、编译器开发人员和硬件设计人员都从各自的角度研究和构建虚拟机。
虽然每一种虚拟机应用都有它独特的性质,但是它们的基本概念和技术在虚拟机范围内有很多共同点。
由于各种不同的虚拟机体系结构和支撑技术是由不同的工作组开发的,统一虚拟机的知识体系、理解各种不同形式虚拟机的共同的支撑技术显得特别重要。
在「虚拟机系统与进程的通用平台」一书中,采用统一的方法讲述虚拟机家族,讨论虚拟机的共同的支撑技术,通过探索它们的多种应用,说明它们的通用性。
后续我们将通过更多文章,来和大家进行进一步地讨论。