对于普通的独立主机,不同的进程使用调度程序进行上下文切换。例如,假设有进程 1 和进程 2,则控制权从进程 1 转到调度程序,然后从调度程序转到进程 2,然后进程 2 一直执行,直到将控制权交还给调度程序以调度另一个进程。
我想知道从进程 1 到进程 2 的切换在虚拟机中是如何进行的?VM_EXIT()
每次虚拟机内部两个进程之间发生进程切换时,虚拟机都会调用吗?或者主机调度程序与进程切换有关?
据我所知,主机操作系统将虚拟机视为单个进程。有人能指出一些提示,让我可以消除这些疑虑吗?
答案1
虚拟机不了解内部发生的情况,它们只是模拟硬件。
VM 模拟有 3 种基本方法。最明显的一种是硬件模拟,这就是 Bochs 所做的。它只是以编程方式模拟 x86 兼容的 PC,背后没有任何更深层次的魔法。PC 是处理数据的机器,因此 Bochs 只是使用主机操作系统收集输入数据并将其提供给模拟的虚拟设备,然后从这些设备读取输出数据并使用主机呈现它。这正是控制台仿真器和类似程序所做的。Bochs 不知道 VM 内部发生了什么,它在裸露的模拟硬件上工作。进程的概念对它来说太抽象了,它不必关心这些事情 - 只需硬件模拟。
第二种 VM 是在引入硬件加速虚拟化之前很常见的。Bochs 风格的仿真速度很慢,因为它逐字节解释机器代码。由于 CPU 的工作方式(它们这样做是有充分理由的),在正在运行的操作系统中运行裸字节码是不可能的,但应用程序可以获取一段字节码并对其进行编辑,使其可以在主机操作系统中安全执行,然后将其作为自己的代码执行。编辑阶段有两个目的:它清理代码以使其可以运行,并将模拟的 I/O 设备连接到主机的适当数据源/目标。不过,对于 VM 来说,不存在类似进程的东西,它只是在物理 CPU 上伪模拟代码,假装它是程序的代码。
最后,第三种虚拟机是硬件加速虚拟化虚拟机。它需要硬件支持,但所有现代 CPU 都支持。它只是在做我之前说过的不可能的事情:与主机操作系统并行运行低级代码。问题是,如果你将它内置到 CPU 中,你可以让它正确处理代码。它将为该代码创建一个沙盒环境,让主机控制该沙盒。这样,虚拟机代码的执行距离硬件更近,因此运行速度更快。它也更接近使用硬件环系统,但仍然没有引入确切的进程概念。这些始终由客户操作系统处理。但在硬件加速虚拟机中,你确实可以看到类似于主机上的上下文切换。其他类型的虚拟机始终作为用户级程序运行。
答案2
VM 内部的进程切换与普通机器上的进程切换相同。操作系统只是改变其正在处理的进程。主机不知道或不关心 VM 内部发生了什么——这有什么区别?