系统虚拟化:理解IO虚拟化和Hypervisor的作用

4
我希望能够正确理解I/O虚拟化。此处的上下文是纯/全虚拟化,而非部分虚拟化。
我的理解是,虚拟机监视器(hypervisor)对硬件进行虚拟化,并为每个沙盒应用程序提供虚拟资源。每个沙盒都认为自己正在访问底层硬件,但实际上并非如此。相反,所有访问都由虚拟机监视器完成。我需要更好地理解这一方面。
假设一块芯片有一个硬件定时器,用于作为操作系统内核的时钟计时器。假设有两台虚拟机(例如Windows和Linux)运行在虚拟机监视器之上。
两个虚拟机都没有修改其源代码。所以它们继续输出直接编程计时器资源的指令。
虚拟机监视器在这里的真正角色是什么?这两个操作系统如何真正地被防止访问真正的东西?
1个回答

3

经过一些阅读,我已经达到了所描述的一定程度的理解:

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平台上模拟必要的动作。因此,仿真器提供了一个虚拟化环境。

在这种情况下,系统资源的虚拟化不是通过陷阱和执行模型来执行的。


+1 表示再次提到答案。 - TonySalimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接