从结构上看,虚拟化与模拟有何不同?

从结构上看,虚拟化与模拟有何不同?

有人告诉我,VirtualBox 之类的虚拟化程序与模拟器的工作方式不同,因为它不模拟寄存器,而是使用实际寄存器来存储 CPU 上的虚拟化数据。模拟器必须模拟寄存器,因为它们主要用于执行依赖于外部环境的软件(例如,Genesis 模拟器需要 Motorola 68000 的寄存器和内存地址,因此开发人员必须将这些资源作为模拟寄存器提供)。

我的主要问题是,虚拟化是如何开发的?我们如何让整个操作系统作为虚拟机中的进程运行,但又让它独立运行,同时仍然使用实际的 CPU?我只懂模拟,不懂虚拟化,所以如果有人能帮忙就太好了!

PS:我问的不仅仅是有什么区别,而是它们运行软件的方式有何不同。

答案1

最初,您无法让客户操作系统使用真实硬件,因为您无法控制它。如果您尝试在真实 CPU 上运行它,则无法保证它会将控制权交还给主机操作系统。

您所描述的虚拟化是在硬件中实现的,它允许在硬件级别应用某些规则和限制,这些规则和限制可以由主机操作系统管理。这允许主机操作系统设置有关客户机可以做什么和不能做什么的规则,然后在实际硬件上运行客户机。如果客户机试图对实际硬件执行违反规则的操作(例如尝试访问磁盘设备),硬件将暂停客户机并向主机发送中断,这允许主机提供响应(例如从模拟磁盘设备返回数据),然后恢复客户机。

以下是该过程的一个简化示例:

主机操作系统:嘿 CPU,我需要你以虚拟化方式运行此代码。如果它想做一些不仅仅是执行指令的事情,请打电话给我。

主机 CPU:你说对了!
主机 CPU 保存所有主机寄存器和状态,然后开始执行 Guest OS 代码

客户操作系统:我还活着!嘿 CPU,你能把这个文件给我吗?

主机 CPU:呃……好的。请稍等。
主机 CPU 保存所有客户机寄存器和状态,然后恢复所有主机寄存器和状态
主机 CPU:嘿,主机操作系统,访客想要这个文件!

主机操作系统:哦,那就给他们这个:来自虚拟硬盘的文件

主机 CPU:你说对了!
主机 CPU 保存所有主机寄存器和状态,恢复客户机寄存器和状态,然后开始执行客户机 OS 代码
主机 CPU:这是那个文件!

客户操作系统:太好了,谢谢!

这里的关键区别在于,在模拟器中,客户操作系统实际上从未在硬件上运行。通过虚拟化,主机操作系统将限制配置到 CPU 中,然后在物理 CPU 上实际运行客户代码。上面的示例非常简单,但内存、磁盘 I/O 甚至网络都可以在当今最新的处理器上进行控制,从而允许它们安全地进行交互,而无需每次都打扰主机操作系统。只要客户机不试图超出虚拟化边界,那么如果主机操作系统在给定时间点无事可做,它可能不会运行任何代码。


再补充一点,这只是虚拟化和控制漫长历史中的又一步。(不能保证这是正确的顺序或详尽无遗的,但应该能提供一个很好的开始概述)

最初,没有虚拟化。所有进程都共享相同的内存空间,都具有对硬件的完全访问权限,并且多任务处理能力完全取决于一个进程是否自行停止并将控制权交给下一个进程。如果操作系统想要对某个进程进行任何形式的控制,它在模拟器中运行该过程(没有人这样做,因为它太慢了)。

首先是特权内存:某些操作只能由内存中的特殊区域执行。这些区域由操作系统占用,允许操作系统充当这些特权操作的网关。一个例子是读取/写入硬件数据的能力。这可以防止进程直接读取/写入硬盘,而是强制它们请求操作系统为它们读取/写入。这意味着操作系统可以在执行操作之前检查进程是否有权限。

接下来是虚拟化的“时间”。操作系统可以配置 CPU 以设定的时间间隔中断活动进程,从而允许它控制调度并在进程之间切换。操作系统现在可以直接在硬件上运行进程,仍然防止它们滥用 CPU 时间。这是由硬件定时器

接下来是虛擬記憶體:共享内存的问题在于任何进程都可以读取任何其他进程的内存。当 Mary 的程序从 Bob 的 Web 浏览器中读取他的密码时会发生什么?虚拟内存允许操作系统将进程看到的内存映射到物理内存的不同部分,甚至将它们完全移出物理内存(移到页面文件)。每当进程尝试读取或写入内存时,CPU 的 VMMU(虚拟内存管理单元)都会查找它在物理内存中的映射位置,并在那里执行操作。如果它被映射到内存之外,那么 CPU 会调用操作系统将页面从页面文件中提取到内存中。

好了,现在我们已经了解了 X86 处理器的雏形,我们可以安全地运行进程,并且可以主动阻止它们接管系统,除非操作系统明确允许它们这样做。此时,进程实际上是“虚拟化”的。这种支持已经存在了一段时间长的时间,所以你实际上听不到人们谈论虚拟化进程,因为现在只是假设所有进程都是虚拟化的。

但是,为什么虚拟化操作系统如此特殊呢?为什么我们不能直接将其作为进程启动,让它自己运行呢?嗯,问题在于,作为操作系统,客户系统希望能够访问和使用主机用来控制进程的相同控件 - 基本上,操作系统希望成为计算机的最高统治者,如果不是这样,它们根本无法工作。“硬件虚拟化”扩展(AMD 的 AMD-V 和 Intel 的 VT-x)允许主机操作系统提供虚拟过程控制的虚拟化集(虚拟特权内存、虚拟硬件计时器、虚拟虚拟内存)。

答案2

我们如何使整个操作系统作为虚拟机中的进程运行,但又让它独立运行,同时仍然利用实际的 CPU?

(以下内容已简化很多。)

主要通过利用操作系统用来保持用户模式进程正常运行的相同或类似的机制。

当用户模式进程尝试做一些不允许做的事情时,就会导致CPU异常。

因此,如果我们让操作系统内核在用户模式下运行,那么每当它尝试执行某些操作(例如直接访问硬件)时,都会导致异常。虚拟机管理程序可以发现该异常,并以模拟或虚拟化行为做出响应,而不会像普通内核那样导致系统崩溃。

它可以代表该内核执行硬件访问,执行修改后的硬件访问(即访问文件的一部分而不是直接访问磁盘扇区),或者您可能想到的任何其他操作。

CPU 虚拟机扩展基本上将 CPU 的整个“主管”或“受保护”模式扩展了一个级别来执行此操作,并且还提供了额外的虚拟内存“嵌套级别”,以便分页更容易虚拟化。

答案3

虚拟化涉及模拟计算机硬件的某些部分 - 足以让客户操作系统在未经修改的情况下运行 - 但出于效率原因,大多数操作仍然在真实硬件上进行。因此,虚拟化通常比仿真更快,但真实系统必须具有与客户系统相同的架构。例如,VMWare 可以提供虚拟环境,用于在真实计算机“内部”运行虚拟 Windows XP 计算机。但是,VMWare 无法在除真实 x86 PC 之外的任何真实硬件上运行。

仿真虚拟机用软件模拟完整的硬件。这样,一个计算机架构的操作系统就可以在模拟器所针对的架构上运行。由于所有操作都在软件中运行,因此模拟速度往​​往较慢,但由于它独立于硬件,因此可以支持更多平台。

答案4

为了完整起见,还有模拟,其中机器的操作被复制,但使用的代码的内部结构可能与“真实”机器完全不同。(想想“飞行模拟器”。)模拟器通常会编译“真实”机器的源代码,但针对完全不同的 CPU 架构,具有完全不同的操作系统和 I/O 设施。

相关内容