如果 dtb 和机器交换,为什么 qemu-system-arm 会挂起?

如果 dtb 和机器交换,为什么 qemu-system-arm 会挂起?

我正在尝试使用 qemu-system-arm 来模拟嵌入式系统。我使用的是 Ubuntu 20.04 并安装了 QEMU 模拟器版本 5.0.0 (Debian 1:5.0-5ubuntu6~ppa0) 的向后移植。我想我会尝试一些“简单”的东西来开始,并模拟 Raspberry Pi。在尝试了大约十几个例子之后,我终于找到了一个有效的例子这里。按照链接中的说明提取内核和 dtb,然后我可以使用以下命令模拟 Raspberry Pi 2b

qemu-system-arm -M raspi2 -kernel ./kernel7.img -dtb ./bcm2709-rpi-2-b.dtb -sd ./2020-02-13-raspbian-buster-lite.img -serial stdio -append "$(<cmdline.txt)"

这很棒。但是,如果我尝试更改它以运行树莓派的不同版本,qemu 就会挂起。

qemu-system-arm -M versatilepb -cpu arm1176 -m 256 -kernel ./kernel7.img -dtb ./bcm2709-rpi-2-b.dtb -sd ./2020-02-13-raspbian-buster-lite.img -serial stdio -append "$(<cmdline.txt)"
qemu-system-arm -M versatilepb -cpu arm1176 -m 256 -kernel ./kernel7.img -dtb ./bcm2708-rpi-b.dtb -sd ./2020-02-13-raspbian-buster-lite.img -serial stdio -append "$(<cmdline.txt)"

我相信这-M versatilepb -cpu arm1176 -m 256是 Raspberry Pi 1 架构的近似值。我用 Raspberry Pi 2 和 Raspberry Pi 1 的 dtb 进行了尝试,但它无法从 VM 启动,并有抱怨:

pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument

我也尝试过:

qemu-system-aarch64 -M raspi3 -kernel ./kernel7.img -dtb ./bcm2710-rpi-3-b.dtb -sd ./2020-02-13-raspbian-buster-lite.img -serial stdio -append "$(<cmdline.txt)"

我相信它应该模拟 Raspberry Pi 3,但它挂起而根本不打印任何输出。我还尝试了很多其他组合,其中大多数都挂起而不打印任何输出。

我希望能得到某种解释,解释是什么原因导致 qemu 挂起,而没有任何输出到终端(并且带有空白的 Qemu 窗口)。这是由 -M 加载的机器与 dtb 文件和/或内核不匹配引起的吗?具体什么不匹配?是使用的内存地址吗?可用的外围设备?

或者这只是 qemu-system-arm 的正常行为 - 它仅适用于一组有限的硬件,并且其他任何东西都需要详细了解硬件架构才能精确配置匹配的虚拟机?

或者我的 qemu 安装有问题吗?如上所述,我大约有十几个例子(例如)这对我不起作用。我认为这是因为这些示例适用于不同版本的 qemu 和/或我做了一些微妙的错误,但也许不是?

相关内容