在结构方面,虚拟化与仿真有何不同?

ton*_*ons 20 virtualbox virtualization emulation virtual-machine

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

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

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

Dar*_*oid 33

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

您描述的虚拟化是通过允许在硬件级别应用某些规则和限制而在硬件中实现的,这些规则和限制可以由主机操作系统管理。这允许主机操作系统设置关于来宾可以做什么和不可以做什么的规则,然后在真实硬件上实际运行来宾。如果guest试图对违反规则的真实硬件做一些事情(例如尝试访问磁盘设备),硬件将挂起guest并向主机发送中断,这允许主机提供响应(例如从模拟磁盘设备返回数据),然后恢复来宾。

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

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

主机 CPU:你明白了!
主机 CPU 保存所有主机寄存器和状态,然后开始执行客户操作系统代码

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

主机 CPU:呃……当然。一会。
Host CPU 保存所有的访客寄存器和状态,然后恢复所有的主机寄存器和状态
Host CPU:嘿 Host OS,Guest 想要这个文件!

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

主机 CPU:你明白了!
主机 CPU 保存所有主机寄存器和状态,恢复来宾寄存器和状态,然后开始执行来宾操作系统代码
主机 CPU:这是那个文件!

来宾操作系统:太棒了,谢谢!

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


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

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

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

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

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

好的,所以此时我们已经接近 X86 处理器的开始,我们可以安全地运行进程并可以主动阻止它们接管系统,除非操作系统特别允许它们这样做。在这一点上,流程被有效地“虚拟化”。这种支持已经存在长时间了,所以你并没有真正听到人们谈论虚拟化进程,因为它只是假设现在所有进程都被虚拟化了。

但是,为什么虚拟化操作系统很特别?为什么我们不能把它作为一个流程来启动,让它做自己的事情?好吧,问题在于,作为操作系统,来宾系统希望能够访问和使用主机用来控制进程的相同控件——基本上,操作系统希望成为计算机的最高统治者,而他们根本就没有如果不是这样,那就不行了。“硬件虚拟化”扩展(AMD 为 AMD-V,Intel 为 VT-x)允许主机操作系统提供一组虚拟化的虚拟进程控制(虚拟特权内存、虚拟硬件计时器、虚拟虚拟内存)。

  • @NothingsImpossible:除非你有一台很旧的机器,否则现在销售的大多数主流 CPU 都支持硬件虚拟化。基本虚拟化始终是可能的,因为如果任何程序(如客户操作系统)尝试执行当前安全级别不允许的指令,CPU 将向主管(内核)发送中断。主机操作系统要做的就是捕获这些中断,找出所需的操作,并恢复子进程的执行。AMD-V/VT-x 只能实现更高效的虚拟化,因为现在 CPU 本身可以提供“不允许”的指令。 (2认同)

Kel*_*ari 0

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

仿真中,虚拟机用软件模拟完整的硬件。这允许一种计算机体系结构的操作系统在为其编写模拟器的体系结构上运行。由于所有操作都在软件中运行,因此仿真往往速度较慢,但​​由于它独立于硬件,因此可以支持更多平台。