系统虚拟化:了解IO虚拟化和虚拟机管理程序的角色

时间:2012-10-21 07:12:33

标签: system virtual-machine virtualization hypervisor

我想获得对I / O虚拟化的正确理解。上下文是纯/完全虚拟化而不是半虚拟化。

我的理解是虚拟机管理程序虚拟化硬件并为每个沙盒应用程序提供虚拟资源。每个沙箱都认为它访问底层硬件,但实际上并非如此。相反,它是管理程序,它执行所有访问。正是这方面我需要更好地理解。

假设芯片有一个硬件定时器,意味着OS内核将其用作滴答定时器。让我们假设有两个虚拟机(例如Windows和Linux)在虚拟机管理程序上运行。

所有虚拟机均未修改其源代码。因此,他们继续吐出直接编程定时器资源的指令。

虚拟机管理程序在这里的作用是什么?两个操作系统如何真正阻止访问真实的东西?

1 个答案:

答案 0 :(得分:3)

经过一番阅读后,我达到了一定程度的理解:

https://stackoverflow.com/a/13045437/1163200

我完全在这里重现:

这是试图回答我自己的问题。

System Virtualization : Understanding IO virtualization and role of hypervisor

虚拟化

虚拟化作为一个概念,可以使多个/不同的应用程序在相同的底层硬件上共存,而不会彼此了解。

例如,Windows,Linux,Symbian等完整的操作系统及其应用程序可以在同一平台上共存。所有计算资源都是虚拟化的。

这意味着上述机器都无法访问物理资源。唯一可访问物理资源的实体是称为虚拟机监视器(又称Hypervisor)的程序。

现在这很重要。请仔细阅读并重新阅读。

虚拟机管理程序为上面的每台机器提供虚拟化环境。由于这些机器不是物理硬件而是访问虚拟化硬件,因此它们被称为虚拟机。

例如,Windows内核可能希望启动物理计时器(系统资源)。假设ther timer是内存映射IO。 Windows内核在Timer地址上发出一系列加载/存储指令。在非虚拟化环境中,这些加载/存储将导致计时器硬件的编程。

但是,在虚拟化环境中,这些基于Load / Store的物理资源访问将导致陷阱/故障。陷阱由管理程序处理。 Hypervisor知道windows尝试编程定时器。管理程序维护每个虚拟机的Timer数据结构。在这种情况下,管理程序会更新它为Windows创建的计时器数据结构。然后它编程实时计时器。计时器生成的任何中断都由管理程序首先处理。更新虚拟机的数据结构,并调用后者的中断服务例程。

简而言之,Windows完成了在非虚拟化环境中所做的一切。在这种情况下,其操作导致不更新真实系统资源,但虚拟资源(上面的数据结构)得到更新。

因此,所有虚拟机都认为他们正在访问底层硬件;实际上对他们来说不了解,所有对物理硬件的访问都是由管理程序调解的。

上述所有内容均为完整/经典虚拟化。大多数现代CPU都不适合经典虚拟化。陷阱/故障不适用于所有指令。因此,在现代设备上很容易绕过虚拟机管理程序。

这是半虚拟化产生的地方。虚拟机源代码中的敏感指令被调用Hypervisor取代。上面的加载/存储代码段可能会被调用替换为

Hypervisor_Service(Timer Start, Windows, 10ms); 

EMULATION

仿真是与虚拟化相关的主题。想象一下,最初为ARM编译的程序可以在ATMEL CPU上运行。 ATMEL CPU运行一个Emulator程序,该程序解释每个ARM指令并在ATMEL平台上模拟必要的操作。因此,模拟器提供了虚拟化环境。

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