经过一些阅读,我已经达到了所描述的一定程度的理解:
https://dev59.com/_m025IYBdhLWcg3wX03z#13045437
我在这里完整地复制它:
这是回答我的问题的一种尝试。
系统虚拟化:理解 IO 虚拟化和 Hypervisor 的作用
虚拟化
作为一个概念,虚拟化使得多个/不同的应用程序可以在相同的底层硬件上共存,而彼此之间并不知晓。
例如,完整的操作系统如 Windows、Linux、Symbian 等及其应用程序可以共存于同一平台上。所有计算资源都被虚拟化了。
这意味着上述机器都没有访问物理资源的权限。唯一能够访问物理资源的实体是一个称为虚拟机监视器(也称为 Hypervisor)的程序。
现在这很重要。请仔细阅读和反复阅读。
Hypervisor 为上述每个机器提供了虚拟化环境。由于这些机器访问的不是物理硬件,而是虚拟化硬件,因此它们被称为虚拟机。
作为示例,Windows内核可能想要启动一个物理计时器(系统资源)。假设该计时器是内存映射IO。Windows内核在计时器地址上发出一系列Load/Store指令。在非虚拟化环境中,这些Load/Store将导致编程计时器硬件。
然而,在虚拟化环境中,基于这些Load/Store的物理资源访问将导致陷阱/故障。陷阱由超级监视器处理。超级监视器知道Windows试图编程计时器。超级监视器为每个虚拟机维护计时器数据结构。在这种情况下,超级监视器更新为Windows创建的计时器数据结构。然后它编程实际的计时器。计时器生成的任何中断都首先由超级监视器处理。更新虚拟机的数据结构并调用后者的中断服务例程。
长话短说,Windows在非虚拟化环境中所做的一切都做了。在这种情况下,它的操作导致未更新真正的系统资源,而是更新了虚拟资源(上述数据结构)。
因此,所有虚拟机都认为它们正在访问底层硬件;实际上,所有对物理硬件的访问都是通过超级监视器进行调解的,虚拟机并不知情。
以上所述的都是完全/经典虚拟化。大多数现代CPU不适用于经典虚拟化。陷阱/故障并不适用于所有指令。因此,现代设备上的超级监视器很容易被绕过。
这就是para-virtualization出现的地方。虚拟机源代码中的敏感指令被替换为对Hypervisor的调用。上面的load/store片段可以被类似以下的调用所替换
Hypervisor_Service(Timer Start, Windows, 10ms)
仿真
仿真是与虚拟化相关的主题。想象一种情况,一个最初为ARM编译的程序被制作成在ATMEL CPU上运行。ATMEL CPU运行一个仿真器程序,解释每个ARM指令并在ATMEL平台上模拟必要的动作。因此,仿真器提供了一个虚拟化环境。
在这种情况下,系统资源的虚拟化不是通过陷阱和执行模型来执行的。