我们可以用管理程序伪造处理器和 RAM 吗?

Could we fake processor and RAM with hypervisor?

我听说过很多关于 "Hypervisors are not emulators. If you need to emulate another hardware specifications than you computer have, you need to use emulator, not hypervisor" 的事。

嗯,但是昨天我在 youtube 上看到了这个视频 - click here - 它展示了如何使用 VMware Fusion 在现代 macOS 上安装 Win 95。

对我来说奇怪的是,在 17:39 上你可以看到 Win 95 虚拟机是 "Pentium Pro with 64 MB RAM"。

嗯!那么,Fusion 以某种方式伪造了处理器和 RAM,对吧?但它不是模拟器,对吧?那么,这是否意味着任何管理程序都可以伪造处理器和 RAM?

在发布时,Windows 95 只有代码可以识别 Pentium Pro 之前的 CPUID。任何不低于 Pentium Pro 的处理器都是 "called" Pentium Pro。

主要区别在于 Hypervisor 无法模拟 CPU 代码。所有代码必须 运行 在原始处理器上。

管理程序确实模拟了 BIOS,它告诉 OS 可用的硬件规格;包括 RAM、引导顺序和附加的外围设备。

当您谈论 VMWare Fusion 时,其工作方式取决于虚拟化的实现方式。根据 wikipedia VMWare Fusion 利用硬件辅助虚拟化、动态二进制翻译和准虚拟化。

hardware-assited virtualization的情况下,@Strom是正确的,来宾指令可以直接在主机上执行CPU。除了@Strom 的回答,您还可以通过捕获和模拟 cpuid 指令来伪造 CPU 类型。

para-virtualization 的情况下,您通过调用代表来宾模拟指令的管理程序来替换关键指令。因此,您再次将 cpuid 指令模拟为 "fake" CPU 类型。请记住,这需要经过修改的半虚拟化来宾操作系统。

最后,dynamic binary translation 在运行时扫描来宾代码以查找关键指令,并通过陷阱替换它们到管理程序中以实现某种 "live para-virtualization" 或将来宾代码块转换为等效的主机块根据原始访客代码修改 VM 状态的代码(这就是 QEMU 全系统模拟器的工作方式)。因此,您可以再次通过模拟 cpuid 指令来 "fake" CPU 类型。请注意,在这种情况下,来宾和主机可以是相同的体系结构,但没有必要这样做。

当然以上技术的组合也是可行的。

至于主内存的虚拟化,管理程序完全控制硬件,因此您可以简单地配置一个只有 64MB 主内存的 VM。由于上面简短讨论的技术,VM 无法 "see" 超过此。

请记住,这只是对虚拟化的一个非常简短的概述,我尽量保持简短和信息丰富,所以我知道我的解释部分不是很准确。如果您真的对虚拟化感兴趣,我建议您阅读 "Virtual Machines: Versatile Platforms for Systems and Processes"Popek & Goldberg 和 [=28= 关于该主题的论文]"Xen and the Art of Virtualization"