回想起 2006 年,我第一次在电脑上安装 VMware Workstation 时,突然发现可以在 Windows 里流畅运行另一个独立的 Linux 系统,那种震撼至今记忆犹新。但如今回过头去复盘底层技术,却发现了一个细思极恐的事实:在 2005 - 2006 年之前,无论是 Intel 还是 AMD 的 x86 架构 CPU,在硬件层面是完全不支持虚拟化技术的!
那么,在 CPU 根本不认识虚拟化的年代,早期的虚拟机到底是怎么跑起来的?大名鼎鼎的 1 型裸金属虚拟化 ESXi 又是如何封神的?今天这篇博文,带大家一起穿越回那个“软件黑科技硬刚硬件缺陷”的黄金年代。
零、 历史的缺陷:不可虚拟化的 x86 架构
要看懂虚拟化的黑科技,首先得知道早期的 CPU 有多“笨”。
在经典的 x86 架构(32位时代)中,CPU 引入了特权级(Ring)的概念,分为 Ring 0 到 Ring 3:
-
Ring 0(最高权限):操作系统内核(Kernel)的专属领地,可以执行所有硬件指令。
-
Ring 3(最低权限):普通应用程序(如浏览器、微信)呆的地方,干任何坏事都会被 CPU 拍死。
根据计算机科学的经典理论,完美的虚拟化需要满足一个条件:当虚拟机想执行敏感指令(比如修改中断、直接操作物理内存)时,必须能被底层的虚拟化软件捕获(Trap)并模拟(Emulate)。
然而,早期的 x86 架构有 17 条敏感指令(如 PUSHF / POPF),它们在低权限执行时不会触发异常,只会默默地直接失败或暴露出物理机的真实状态。这在当年被学术界判定为:x86 架构天生不可虚拟化。
一、 VMware 的封神之作:二进制翻译(BT)
既然硬件有缺陷,软件只能被迫当“神仙”。VMware 的创始团队在 2000 年前后发明了一套极其惊艳的绝活——动态二进制翻译(Dynamic Binary Translation, DBT)。
这套全虚拟化(Full Virtualization)技术的运行逻辑非常聪明且粗暴:
-
分层错位:VMware 把物理机系统留在 Ring 0,把虚拟机的内核降级运行在 Ring 1。
-
偷梁换柱:当虚拟机内核准备执行代码时,VMware 会充当一个极其精密的“过滤器”,在 CPU 实际执行前的几微秒,动态扫描即将执行的二进制代码。
-
原地重写:一旦发现代码中包含了那 17 条缺陷指令,虚拟化软件就会施展“时间静止”,直接在内存中把这段代码改写(翻译)成一段安全的等效指令,再交给 CPU 执行。
这种“边解释、边翻译、边执行”的纯软件骚操作,奇迹般地在没有硬件支持的 CPU 上实现了全虚拟化,奠定了现代云计算帝国的基石。
二、 另辟蹊径的流派:Xen 与半虚拟化(Para)
就在 VMware 用二进制翻译称霸桌面端时,开源界的极客们走出了另一条路——半虚拟化(Paravirtualization),代表作就是早期的 Xen。
既然软件动态翻译太慢,Xen 索性不装了:直接修改虚拟机的操作系统源码!
把内核代码里所有涉及硬件操作的敏感指令,主动改写成向虚拟机监视器发起的“特权调用”(Hypercall)。因为虚拟机自己非常“懂事”且主动配合,省去了中间商,其性能在当年极其逆天,接近物理机。
但它的致命缺点也很明显:必须能改源码。Linux 开源没问题,但 Windows 闭源,在当年根本没办法跑在早期的 Xen 上。
三、 史诗级融合:Linux pv_ops 与被逼出来的 Windows 进化
很多在工作中天天用标准 ISO 装 Linux 的工程师可能会纳闷:“既然半虚拟化要改系统源码,为什么我从来没下载过‘半虚拟化专用 ISO’?”
这是因为在 2008~2012 年间,Linux 官方内核做了一件伟大的事——引入了 pv_ops (Paravirtualization Operations) 统一架构。
它把所有操作硬件的敏感指令打包成函数指针。当现代 Linux 官方 ISO 启动时,它会自动探测环境:在物理机上就用原生汇编指令;在虚拟机里就自动切换成半虚拟化特权调用。半虚拟化代码已经被天然内置在每一个标准 Linux 内核中了。
那 Windows 从来没有为半虚拟化做出修改吗?
不,恰恰相反,微软不仅修改了 Windows,而且改得极深!
从 Windows Server 2008 开始,微软在 Windows 内核中内置了半虚拟化技术,称为 “启蒙”(Enlightenments)。当 Windows 发现自己跑在自家的 Hyper-V 上时,就会主动开启半虚拟化加速。
有趣的是,因为微软只认自家的 Hyper-V 协议,现在的阿里云(KVM)和 VMware 都在底层玩了一个高度内卷的骚操作——“假装自己是 Hyper-V”。它们在底层欺骗 Windows 虚拟机,让 Windows 内核高高兴兴地自己激活内部的半虚拟化加速代码。
而在日常工作中,我们在 Windows 里安装的 VMware Tools 或是 KVM 的 Virtio 驱动,本质上就是往闭源的 Windows 里注入网卡和硬盘的半虚拟化驱动(I/O Paravirtualization),从而让虚拟机的吞吐量暴增。
四、 裸金属 1 型虚拟化:ESX 的“外星科技”时代
随着技术的演进,虚拟化被划分为了两大阵营:
-
2 型虚拟化(宿主型):如 VMware Workstation、VirtualBox,寄生在 Windows/Mac 系统里,中间商多,损耗大。
-
1 型虚拟化(裸金属型):如 VMware ESXi、KVM,直接装在物理硬件上,没有宿主机系统剥削,性能恐怖。
大家熟知的 VMware ESXi 是在 2008 年发布的,但它的老祖宗 ESX 1.0 诞生在 2001 年!
这又是一个反常识的时间差:2001 年,没有硬件虚拟化,没有 pv_ops,ESX 是怎么直接躺在硬件上的?
VMware 当年玩了一个极其无赖但精妙的架构:借道启动,强行夺权。
-
借道:ESX 启动时,其实最先跑的是一个裁剪版的 Linux(叫 Service Console),用来把服务器的各种主板、硬驱硬件初始化好。
-
夺权:硬件初始化刚完,VMware 的核心内核 VMkernel 突然激活,利用底层特权,强行把那个 Linux 踹到一边并降级隔离,自己全面接管物理 CPU 和内存。
-
肉搏:接管硬件后,再用纯软件的“二进制翻译”和“影子页表(Shadow Page Tables)”去贴身肉搏虚拟机的指令,硬生生在 2001 年做出了裸金属全虚拟化。
到了 2006-2008 年,CPU 硬件辅助虚拟化(Intel VT-x / AMD-V)全面普及,硬件自己就能完美捕获虚拟机的敏感指令(VM-Exit 机制)。
VMware 顺势卸磨杀驴,把那个笨重的 Linux 启动壳彻底砍掉,推出了只有几十兆、开机即用、全面拥抱硬件加速的纯净版 —— ESXi,开启了现代云计算的黄金时代。
写在最后
纵观这 20 多年的虚拟化演进史:
从 2001 年的纯软件黑科技(ESX)——> 2005 年的硬改源码(Xen半虚拟化)——> 2006 年以后的硬件辅助虚拟化 + 现代 I/O 半虚拟化驱动(Virtio / VMXNET3) 的完美结合。
我们现在的理所当然,背后其实是一代代顶尖软件工程师与硬件厂商相爱相杀、用神乎其技的算法硬生生在荒原上推开的云计算大门。

1万+

被折叠的 条评论
为什么被折叠?



