为什么 QEMU 使用 JIT 编译?

Why does QEMU use JIT compilation?

QEMU 在请求对具有不同硬件架构(或-accel=tcg)的来宾进行完全虚拟化时使用 TCG“加速器”。

TCG 是一个 JIT 编译器,它通过翻译指令并在运行时立即调用它们来模拟来宾体系结构集。可移植性取决于 TCG 支持的架构列表。

现实地说,是否有可能将操作系统编译成一些高效的 IR(类似于 Java 字节码)并完全在软件中为该字节码实现虚拟机?

“为什么 QEMU 使用 JIT 编译”的简短回答是“因为它比其他方式更快,比如解释,但它仍然可以处理任意的来宾二进制文件”。已经完成了一些工作(不是在 QEMU 本身,而是通过其他项目或研究工作)通过将来宾二进制文件静态转换为主机体系结构的代码来进行仿真,但这很棘手,您仍然必须能够回退到某些东西例如 JIT 来处理涉及自修改代码或本身就是 JIT 的来宾二进制文件(想想 运行在 QEMU 中安装 Java 来宾)。

当然有可能有一个操作系统被编译成 IR 字节码,然后在各种主机上的虚拟机上可移植地执行。这方面的历史例子包括 Taos (http://www.uruk.org/emu/Taos.html) and the UCSD p-System (https://en.wikipedia.org/wiki/UCSD_Pascal)。请注意,您仍然可能希望在这样的 VM 中使用 JIT 实现字节码执行引擎,因为它比解释字节码更快,并且可能有一些 host-CPU-specific bits of VM结果实施。

然而,这种便携式操作系统的尝试与 QEMU 完全不同,QEMU 的目的是 运行 仿真 现有 预构建二进制文件对于给定的来宾 CPU 架构。