如何使用 QEMU 模拟混合平台?

How can I use QEMU to simulate mixed platforms?

背景

有很多关于使用 QEMU 模拟特定架构系统(“平台”)的文档。
例如x86、ARM或RISCV系统。
第一步是配置 QEMU 目标列表,for example ./configure --target-list=riscv32-softmmu.
也可以在目标列表中提供多个目标,但显然这会为每个指定平台构建一个独立的模拟。

然而,我的目标是模拟一个具有 混合 目标的系统:一台 x86 机器,它还通过 PCI 托管一个 RISCV 嵌入式处理器。

显然我需要实现一个 QEMU PCI 设备,它将在 x86 平台上托管 RISCV 设备,并且 我很清楚如何实现 generic PCI device。 但是,我不确定在同一个 QEMU 模拟中同时模拟 x86 和 RISCV 的最佳方法

一种方法是 运行 QEMU 的两个实例(作为两个单独的进程)并使用某种 IPC 在 x86 和 RISCV 模拟之间进行通信。
另一种可能的(?)方法是将 RISCV QEMU 构建为可加载库并从 x86 QEMU 加载它。
也许甚至有可能拥有一个模拟 x86 和 RISCV 的单一 QEMU 应用程序?
另一种方法是不使用 QEMU 来模拟 RISCV 设备。我可以实现一个完全封装 RISCV 模拟的 QEMU PCI 设备,例如 tiny-emu,但我宁愿将 QEMU 用于 x86 和 RISCV。

我的问题是:


相关

https://lists.gnu.org/archive/html/qemu-devel/2021-12/msg01969.html

QEMU 不支持在同一个 QEMU 进程中 运行 多个目标架构。 (这是我们理论上希望能够做到的事情,但它需要对 QEMU 的核心部分进行大量修改,假设目标体系结构在编译时是已知的。到目前为止,没有人觉得它重要到足以将在所需的重大开发工作中。)

因此,如果你想这样做,你需要以某种方式将主要架构的 QEMU 进程与其他一些进程拼接在一起,以执行二级架构(QEMU 或其他)。这已经完成了(例如 Xilinx 有一个 out-of-tree QEMU-based 系统可以用多个 QEMU 进程做这种事情)但我不知道有任何简单的 off-the-shelf 框架或设置来做吧。我怀疑弄清楚 time/clocks 如何在两个模拟之间相互作用是棘手的方面之一。

还有一个选择 你可以启动 2 个 QEMU 进程并通过套接字连接它们 然后您可以创建 运行 脚本,在您的订单中启动它们

它的“时钟”不太准确,但足以虚拟您的硬件

另一个选项是https://wiki.qemu.org/Features/MultiProcessQEMU

但是你需要破解这个实验代码