使用 QEMU 模拟 Arietta G25 开发板

Emulating an Arietta G25 board with QEMU

我正在尝试使用 QEMU 模拟 Arietta G25 开发板,但遇到了一些困难。

我开始编译 Linux 补丁以支持 Arietta,如 here 所述。然后我用 qemu-system-arm -M help 检查了支持的机器列表,注意到虽然 Arietta 板没有列出,但有一个 versatileabversatilepb 的选项,它们具有与 Arietta 相同的处理器。

在内核目录arch/arm/boot中,我运行命令

QEMU_AUDIO_DRV=none \
qemu-system-arm -M versatilepb \
                -m 256M \
                -kernel zImage \
                -dtb dts/acme-arietta.dtb \
                -nographic \
                -append "console=ttyAMA0"

我希望看到内核启动并立即出现由于缺少根文件系统而出现的恐慌。但是,我的控制台上从未显示任何文本。

我尝试使用控制台的参数(例如使用 ttyS0、添加费率等),但这没有用。

对于习惯了 x86 的 ARM 嵌入式世界的人们来说,这是一个非常常见的混淆点。对于 x86,基本上你购买的每一件硬件看起来都像一台标准的 PC——内存、串行端口等都将位于完全相同的位置并以相同的方式访问。因此来宾软件通常只能在这些系统中的任何一个上运行。

ARM 非常不同。不同的嵌入式板卡和 SoC 会有不同的设备存在,并将它们放在不同的地址。软件 运行 需要构建以与这些设备一起工作,并且尝试 运行 低级软件(如内核或引导加载程序或固件映像)在错误类型的设备上将无法工作。这里发生的事情是你说 "boot a kernel built for Arietta and tell it that the UART is where the Arietta's UART lives",但你 运行 将它放在一个非常非常不同的模拟硬件 (versatilepb) 上。内核将尝试与不存在的硬件对话,并且只会崩溃。它也不能打印任何东西,因为它不知道 versatilepb UART 在哪里。

向 QEMU 添加对新板模型仿真的支持并不是一个微不足道的过程(将其视为与向 Linux 内核添加对该板的支持大致相同的工作量),因为您需要为该板上的所有硬件编写设备模型,来宾内核尝试使用这些硬件。