虚拟化CPU仿真

nik*_*sdi 2 virtualization virtual-machine

我有一个关于虚拟机 CPU 虚拟化的问题。我无法理解即时到本机代码翻译和陷阱和模拟翻译之间的区别。

据我了解,在第一种情况下,假设我模拟来自不同平台的二进制代码,如果我有 x86 CPU,则代码将转换为等效的 x86 指令。现在,在捕获和模拟方法中,虚拟机从客户操作系统接收 ISA 调用,并将其转换为主机操作系统的等效 ISA 调用。

为什么我们需要从 ISA 转换为 ISA?假设我在 Windows 主机上运行 Ubuntu 客户机。Ubuntu ISA 调用与 Windows ISA 调用不同吗?据我了解,来宾无法访问主机上的系统 ISA,只有监视器可以访问。但为什么需要转换为Host ISA呢?ISA还依赖于操作系统吗?

小智 5

当在另一个 ISA 上运行来自一个 ISA 的代码(例如在 x86 CPU 上运行 M68K 代码)时,会使用“即时到本机”转换(通常称为 JIT 编译/转换)。这绝不是虚拟化,而是模拟。

陷阱和模拟是一种在非特权环境中运行“特权”代码的方法(例如:将内核作为应用程序运行)。它的工作方式是,您开始执行特权代码,一旦它尝试执行特权指令(例如 x86 中的 lidt),主机操作系统就会发出陷阱。在该陷阱的处理程序中,您可以模拟该特定特权指令,然后让来宾内核继续执行。这样做的优点是您将达到接近本机 CPU 仿真速度。

然而,仅仅模拟 ISA 只是模拟完整系统的“一小部分”。MMU 的仿真/虚拟化要正确执行并快速运行要复杂得多。