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

Posted

技术标签:

【中文标题】如何使用 QEMU 模拟混合平台?【英文标题】:How can I use QEMU to simulate mixed platforms? 【发布时间】:2020-11-23 12:14:04 【问题描述】:

背景

有很多关于使用 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。

我的问题是:

是否有一些针对混合目标 QEMU 项目的指南或示例? 我搜索了示例,但只找到了将 QEMU 用作单一平台模拟的参考资料,首先您选择要运行的平台。 在 QEMU 中模拟混合平台的最佳方法是什么?用 IPC 分离 QEMU 进程?或者有没有办法配置 QEMU 以模拟混合平台?

相关

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

【问题讨论】:

【参考方案1】:

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

因此,如果您想这样做,您需要以某种方式将主架构的 QEMU 进程与其他一些进程拼接在一起以执行辅助架构(QEMU 或其他)。这已经完成(例如 Xilinx 有一个基于 QEMU 的树外系统,它使用多个 QEMU 进程来做这种事情)但我不知道有任何简单的现成框架或设置来做它.我怀疑弄清楚两个模拟之间的时间/时钟如何交互是棘手的方面之一。

【讨论】:

【参考方案2】:

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

它的“时钟”不太准确,但对于虚拟硬件来说已经足够了

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

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

【讨论】:

以上是关于如何使用 QEMU 模拟混合平台?的主要内容,如果未能解决你的问题,请参考以下文章

如何从源代码构建 grub2 引导加载程序并使用 qemu 模拟器对其进行测试

如何在 qemu 模拟器中构建和运行 .img 文件?

qemu基本使用

ubuntu下使用qemu-system-arm模拟arm环境

再续从零使用qemu模拟器搭建arm运行环境

再续从零使用qemu模拟器搭建arm运行环境