虚拟机最早的构想源于20世纪60年代大型机分时系统的探索,IBM在CP-40和CP-67项目中首次把“虚拟化”从理论变成可运行的系统,1967年为IBM System/360开发的控制程序CP-67成为现代虚拟机管理器的祖师爷。当时的工程师面临一个朴素难题:一台昂贵的IBM大型机,怎样才能让多个程序员同时用它跑程序而不互相干扰?虚拟机的答案是把“一台物理机伪装成多台独立的机器”,这个想法距今已近六十年。
虚拟机构想如何诞生于“计算机比房子贵”的年代
要理解虚拟机是怎么被想出来的,得先回到上世纪六十年代,一台IBM System/360大型机动辄数百万美元,而大学实验室一年预算可能只够租用几十个小时机时,那时计算机运行程序采用的是批处理模式:程序员把打孔卡交给操作员,等几个小时甚至几天后拿到运行结果,业内专家指出,正是这种低效催生了“让机器同时干更多活”的原始冲动。
分时系统的“副作用”点燃了虚拟化思路
麻省理工学院在1961年启动了Project MAC分时系统项目,致力于让多个终端用户通过键盘共享一台大型机的计算时间,分时系统解决的是“多人同时用”的问题,但它无法解决“用户想使用不同操作系统”的痛点,早期大型机的操作系统绑死硬件资源,每个分区只是物理隔离的内存碎片,程序一旦驱动外部设备就可能干扰整个机器。
既然硬件隔离太笨重,能不能在软件层面做一个“模拟层”,让每个用户感觉自己独占了一整台机器? 这就是“虚拟机”概念的哲学原点,1965年左右,IBM剑桥科学中心的工程师开始尝试在System/360上构建一个控制程序,负责管理物理资源并向上层多个操作系统提供“看起来完整”的硬件接口,上层跑的操作系统产生的“敏感指令”,都由下层控制程序截获并模拟执行,这个概念后来被称为虚拟机监视器(VMM),它是所有虚拟化产品的共同祖先。
不兼容系统之间互操作的需求补上了最后一环
除了资源共享,当时IBM还面临一个让客户头疼的问题:1964年System/360推翻了自家大量老旧机型上的软件生态,老客户手里成堆的磁带程序无法直接运行在新机器上,如果能在System/360上虚拟出一台旧的IBM 1401机器,让老程序在新电脑上跑,客户就有了迁移的缓冲期,这种出于“兼容性”需求而模拟另一台计算机的构想,比纯粹的资源管理更具现实意义,贯穿了从CP-40到今天的VMware整个虚拟化演进史。
早期虚拟机实现的三次关键技术突破
从一个想法到一台能跑起来的虚拟机,中间隔着一整套精妙的工程实现,早期实现虚拟机就像在一幢楼里同时安排两套电力系统,既要互不越界,又要都能正常工作。
CP-40:第一套完整虚拟化系统的秘密武器
1964至1967年间,IBM剑桥团队一直在打磨一套名为CP-40的系统,运行在改进过的System/360 Model 40上,CP-40的核心是一个控制程序(Control Program),负责把物理处理器的处理器状态、内存地址空间和I/O中断统统虚拟化,每当某个分时用户的操作系统执行特权指令或访问受保护的内存区,物理CPU会抛出“程序中断”,控制程序便接管现场,模拟出指令执行期望的结果,然后交还给用户系统,1967年的CP-40已经能同时运行多个不同版本的CMS操作系统,每个用户登录后都会看到一个“完整的虚拟机”。
CP-67和VM/370:让虚拟化走向商用市场
1967年,IBM把CP-40的成果移植到商用机型System/360 Model 67上,诞生了CP-67系统,它不再是个实验室玩具,而是作为分时共享服务正式提供给客户,五年后的1972年,IBM发布了VM/370,首次把虚拟机技术打包进主力大型机产品线,VM/370的体系结构定了日后所有虚拟化产品的基调:
- VMM层:直接运行在裸机上,拥有最高特权级别。
- 虚拟机层:每个用户系统都运行在较低特权级别,无法触碰真实硬件资源。
- 磁盘虚拟化:用一对“虚拟磁盘”文件模拟物理磁道柱面,让虚拟机的存储看起来和真硬盘一模一样。
你可以在VM/370的虚拟机里跑一个IBM DOS系统,同时旁边再开着VM系统,两台“虚拟计算机”互不知晓对方存在,当时的用户手册用了一个生动的比喻:每位登录用户都拥有一份完整的《System/370操作指南》,因为他的确在用一台完整的System/370只不过这台机器是软件变出来的。
早期实现中必须跨过的“指令陷阱”门槛
实现虚拟机最窄的一道关口是CPU指令集的可虚拟化程度,如果一台机器的所有特权指令在非特权模式下执行时都能自动陷入VMM处理,虚拟化实现就相对轻松;但大多数商用处理器都存在少数敏感指令在非特权模式下并不产生陷阱而是悄悄失效,这就导致上层操作系统会得到“假结果”而不自知,IBM System/370经过专门改造后,相当一部分敏感指令被设计成必然陷入,从而成为第一个天生适合虚拟化的主流平台,这个工程上的“逼坑”策略定义了此后半个世纪虚拟化的技术路径。
从大型机下沉到x86:虚拟机实现方案在现代的重生
大型机虚拟化在银行、政府内部悄悄用了三十年,普通人几乎不知道它的存在,直到1998年,一家叫VMware的创业公司把虚拟化概念带到了x86个人计算机上,虚拟机的命运才被彻底改写。x86架构当年在设计时根本没考虑虚拟化,它的某些敏感指令在非特权模式下不会陷入而是静默错乱,直接生搬硬套大型机的方法完全跑不通。
VMware的做法是绕开硬件的限制,采用二进制动态翻译:在运行客户操作系统的同时,把其中的特权指令实时扫描出来,替换成一段调用VMM的“安全”代码序列,再放到CPU上执行,这个思路相当取巧,软件自动完成“翻译-保护-执行-反馈”的全过程,翻译过程平均延迟小于一条微指令周期,此后的突破一个接一个:
- 1999年,VMware首次在普通的Windows NT工作站上同时运行Linux和Windows虚拟机。
- 2003年,Linux内核的KVM(Kernel-based Virtual Machine)项目把VMM做成操作系统的一个内核模块。
- 2005至2006年,Intel和AMD相继在CPU中加入VMX指令集和AMD-V扩展,硬件原生支持虚拟化,软件翻译方案逐渐被让位于硬件辅助虚拟化。
x86虚拟化普及后,用户开始用实际问题来衡量各家方案。虚拟机哪个好用,成了论坛里经久不衰的热帖,如果只是日常尝鲜或者跑个隔离环境,免费开源的VirtualBox足够应付;追求生产环境的稳定性的话,VMware Workstation Pro在快照和虚拟网络配置方面更成熟;若是在Linux服务器上跑无界面的服务,KVM几乎是事实标准。
现代虚拟机的日常体验与核心操作路径
今天的虚拟机,已经从当年大型机上的“分时共享工具”变成家里台式机上的常规软件。虚拟机怎么用?绝大多数人的第一步是下载安装VMware Workstation Player或VirtualBox,然后加载一个ISO镜像文件,选择安装方式,剩下的流程和在一台真实电脑上装系统没什么区别,一个典型的Windows主机跑CentOS虚拟机的操作路径大致是:
- 新建虚拟机 → 选择典型配置 → 选择“稍后安装操作系统”。
- 给虚拟机分配2核CPU和4GB内存,磁盘类型选NVMe,容量可设20GB。
- 挂载CentOS的ISO镜像,启动虚拟机,选择最小化安装以减少资源开销。
- 安装完成后安装VMware Tools或增强功能包,实现剪贴板共享和自适应分辨率。
虚拟机玩游戏怎么样?你可能会抱较高期待,结果往往取决于游戏类型,对于Windows老游戏或独立小游戏,在虚拟机里跑体验接近裸机;但涉及3D GPU加速的3A大作就翻车了普通虚拟机的GPU透传支持一向薄弱,要么性能被质量层压掉一截,要么出现渲染错误,尤其是NVIDIA驱动在虚拟机里的行为限制相当顽固。
虚拟机与容器:现代实现路径的对比分岔
进入云原生时代,技术人员总爱拿虚拟机和容器做对比,虚拟机的实现思路是模拟整台硬件:每个虚拟机包含一个完整的客户操作系统、完整的内存映射、虚拟磁盘、虚拟网卡,隔离性极强,但资源开销也大,容器则跳过了硬件模拟,直接共享宿主机内核,只做进程级隔离,一个CentOS虚拟机动辄占用1GB内存启动,而同一个应用跑在容器里却可以实现毫秒级启动和几十MB内存开销。
行业共识认为:容器适合无状态微服务和大规模弹性伸缩场景,虚拟机则守住了需要完整OS环境、内核参数调优和强隔离边界的传统阵地,公有云上更加常见的方案是嵌套虚拟化:物理服务器跑KVM虚拟机,虚拟机里再部署Docker容器,这种复合架构在相当一部分企业环境里是标准配置。
关于虚拟机原理与实现的常见问题
虚拟机最早是给大型机做资源隔离用的,为什么今天个人电脑也普遍使用虚拟机?
早期大型机一台机器的成本让单位无法为每位员工配一台机器,所以必须用虚拟机把一台机器切成多块,以时间片和内存隔离方式交付给不同用户使用,今天个人电脑性能远超当年大型机,人们在Windows上装一个免费VMware Player或VirtualBox跑一个Ubuntu虚拟机,本质上是把“安全实验”和“跨系统工作”塞进同一台物理设备里,追求的是灵活而非省钱,这和六十年前“省硬件”的初心已经不同了。
硬件辅助虚拟化和早期软件翻译的差距现在还明显吗?
在一台支持Intel VMX或AMD-V的现代CPU上,虚拟机的指令执行效率与裸机之间的差距通常只有几个百分点,对比步骤很简单:你在性能选项里关掉虚拟化支持,随后用一套基准测试对比开启状态下的CPU跑分,能明显看到数据差异,对于普通用户日常的桌面虚拟化和虚拟机安装教程相关需求,硬件辅助虚拟化引入的差距远小于磁盘I/O瓶颈,影响可以忽略。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/629031.html





