经过一番阅读后,我已经达到了一定程度的理解,描述如下:
https://stackoverflow.com/a/13045437/1163200 https://stackoverflow.com/a/13045437/1163200
我在这里完整地复制它:
这是试图回答我自己的问题。
系统虚拟化:了解 IO 虚拟化和管理程序的作用 https://stackoverflow.com/questions/12995768/system-virtualization-understanding-io-virtualization-and-role-of-hypervisor
虚拟化
虚拟化作为一个概念,使多个/不同的应用程序能够在同一底层硬件上共存,而无需相互了解。
例如,Windows、Linux、Symbian 等成熟的操作系统及其应用程序可以在同一平台上共存。所有计算资源都被虚拟化。
这意味着上述机器都无法访问物理资源。唯一可以访问物理资源的实体是称为虚拟机监视器(又名虚拟机管理程序)的程序。
现在这很重要。请仔细阅读并重新阅读。
虚拟机管理程序为上述每台机器提供虚拟化环境。由于这些机器访问的不是物理硬件而是虚拟化硬件,因此它们被称为虚拟机。
例如,Windows 内核可能想要启动一个物理计时器(系统资源)。假设定时器是内存映射 IO。 Windows 内核在定时器地址上发出一系列加载/存储指令。在非虚拟化环境中,这些加载/存储将导致定时器硬件的编程。
然而,在虚拟化环境中,这些基于加载/存储的物理资源访问将导致陷阱/故障。该陷阱由虚拟机管理程序处理。虚拟机管理程序知道 Windows 尝试对计时器进行编程。管理程序维护每个虚拟机的计时器数据结构。在这种情况下,管理程序会更新它为 Windows 创建的计时器数据结构。然后它对实时计时器进行编程。定时器产生的任何中断首先由管理程序处理。更新虚拟机的数据结构并调用虚拟机的中断服务程序。
长话短说,Windows 做了它在非虚拟化环境中会做的所有事情。在这种情况下,其操作导致的不是真实的系统资源被更新,而是虚拟资源(上面的数据结构)被更新。
因此,所有虚拟机都认为它们正在访问底层硬件;事实上,他们不知道的是,对物理硬件的所有访问都是通过虚拟机管理程序进行调解的。
上面描述的一切都是完全/经典虚拟化。大多数现代 CPU 都不适合经典虚拟化。陷阱/故障并不适用于所有指令。因此,现代设备上的虚拟机管理程序很容易被绕过。
这就是半虚拟化应运而生的地方。虚拟机源代码中的敏感指令被对 Hypervisor 的调用所取代。上面的加载/存储片段可以替换为诸如以下的调用
Hypervisor_Service(Timer Start, Windows, 10ms);
仿真
仿真是与虚拟化相关的主题。想象一下这样一个场景:最初为 ARM 编译的程序在 ATMEL CPU 上运行。 ATMEL CPU 运行仿真程序,该程序解释每个 ARM 指令并仿真 ATMEL 平台上的必要操作。因此模拟器提供了一个虚拟化环境。
在这种情况下,系统资源的虚拟化不是通过陷阱和执行模型来执行的。