【问题标题】:Why does QEMU use JIT compilation?为什么 QEMU 使用 JIT 编译?
【发布时间】:2023-03-29 18:40:01
【问题描述】:

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

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

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

【问题讨论】:

  • 考虑到操作系统通常具有低级别的硬件特定代码,您需要拥有支持这些代码的虚拟机(这基本上是 TCG JIT 所做的)或将操作系统重写为使用一台特定的虚拟机。所以理论上是可能的,但我不确定我是否看到了用例
  • @UnholySheep 但大多数设备驱动程序都在 QEMU 软件中完全模拟,大多数硬件特定代码都由 CPU 指令组成,这些指令显然可以在完整的软件 VM 中“执行”,例如JVM。
  • 是的,您可能会编写一个编译器来输出 Java 字节码而不是机器指令,并且还能够将特定于硬件的代码转换为可移植的东西。但是 QEMU 的 TCG 还没有提供什么?
  • @UnholySheep 这可能会提供更好的可移植性,例如,如果使用虚拟机实现,生成的字节码可以在 QEMU 的任何版本和底层硬件上运行,而使用 JIT 编译,你仍然有一个TCG 和底层硬件之间的一对一耦合,为您需要的每个新架构提供支持

标签: virtual-machine emulation virtualization qemu


【解决方案1】:

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

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

然而,这种便携式操作系统的努力与 QEMU 完全不同,QEMU 的目的是在模拟现有为给定客户 CPU 架构的预构建二进制文件下运行。 p>

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 2011-02-23
    • 2020-06-20
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多