类似于VirtualBox的虚拟化如何工作? (需要一些技术细节)

时间:2018-07-26 12:23:22

标签: operating-system

首先考虑仅安装一个操作系统的情况。现在,我运行一些可执行文件。处理器从可执行文件中读取指令并执行这些指令。即使我可以将所需的任何指令放入文件中,我的程序也无法读取HDD的任意区域(并做许多其他可能的“坏”事情)。

它看起来像魔术,但我了解这种魔术是如何工作的。操作系统启动我的程序,并使处理器进入某种“非特权”状态。在这种状态下,不允许使用“不安全”的处理器指令,而使处理器回到“特权”状态的唯一方法是将控制权交还给内核。内核代码可以使用所有处理器的指令,因此可以决定程序是否允许我的程序“询问”可能不安全的事情。

现在假设我们在Windows主机上有VMWare或VirtualBox。来宾操作系统是Linux。我在guest虚拟机中运行一个程序,它将控制权转移到guest虚拟机Linux内核。来宾Linux内核的代码应在处理器的“特权”模式下运行(它必须包含“不安全”的处理器指令!)。但是我强烈怀疑它可以无限制地访问计算机的所有资源。

我不需要太多的技术细节,我只想了解魔术的这一部分是如何工作的。

1 个答案:

答案 0 :(得分:1)

这是一个很大的问题,确实涉及到有关安全性和虚拟化的一些很酷的细节。我将简要概述英特尔®处理器上的工作原理。


操作系统如何管理正常进程?

Intel处理器可随时插入4个不同的“保护环”。当前正在运行代码的环决定了可能运行的特定汇编指令。环0可以运行所有特权指令,而环3不能运行任何特权指令。

操作系统内核始终在环0中运行。此环允许内核执行其所需的特权指令,以控制内存,启动程序,写入HDD等。

用户应用程序在环3中运行。此环不允许运行特权指令(例如,用于写入HDD的指令)。如果应用程序尝试运行特权指令,则处理器将控制进程,并引发内核将在环0中处理的异常。内核可能只会终止进程。

第1环和第2环虽然有用,但往往不使用。

Further reading


虚拟化如何工作?

在对虚拟化提供硬件支持之前,虚拟机监视器(例如VMWare)将需要执行称为二进制转换的操作(请参阅此paper)。在较高的层次上,这包括VMM检查来宾操作系统的二进制文件并以安全的方式模拟特权指令的行为。

现在,在英特尔处理器中提供了对虚拟化的硬件支持(查找英特尔VT-x)。除了上述四个环以外,处理器还具有两个状态,每个状态包含四个环:VMX根模式和VMX非根模式。

主机操作系统及其应用程序以及VMM(例如VMWare)以VMX根模式运行。来宾操作系统及其应用程序以VMX非root用户模式运行。同样,这两种模式都有各自的四个环,因此主机OS在根模式的环0下运行,主机应用在根模式的环3下运行,来宾OS在非根模式的环0下运行,并且来宾OS应用程序以非root用户模式运行在环3中。

当以非root用户模式的环0运行的代码试图执行特权指令时,处理器会将控制权交还给以root模式运行的主机操作系统,以便主机OS可以模拟效果并防止来宾直接访问特权资源(或者在某些情况下,处理器硬件可以自己模拟效果而无需让主机参与)。因此,来宾OS可以“执行”特权指令,而无需对硬件资源进行不安全的访问-指令仅被截获和仿真。来宾不能随心所欲-只能执行主机和硬件允许的操作。

请澄清一下,在非root模式的环3上运行的代码如果尝试执行特权指令,则会导致将异常发送到来宾OS,就像如果代码将异常发送到主机OS以root模式的第3环运行的计算机尝试执行特权指令。