由于缺少 dtb,使用 Qemu 模拟 Raspberry Pi 零 W 失败
Emulate Raspberry Pi zero W with Qemu failed due to missing dtb
我正在尝试根据我在真实 Raspberry Pi 零 W 上使用的图像使用 Qemu 模拟 Raspberry Pi 零 W。
我使用的命令是:
sudo qemu-system-arm \
-kernel ./qemu-rpi-kernel/kernel-qemu-4.9.59-stretch \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-hda pi_zero_kinetic_raspbian.qcow \
-cpu arm1176 -m 512 \
-M versatilepb \
-no-reboot \
-serial stdio \
-net nic -net user \
-net tap,ifname=vnet0,script=no,downscript=no
但是 Qemu 抱怨 Error: unrecognized/unsupported machine ID (r1 = 0x00000183)
所以添加了这个选项:
-dtb linux/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
但在这种情况下:
qemu-system-arm: Unable to copy device tree in memory
Couldn't open dtb file qemu-rpi-kernel/tools/linux/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
所以我尝试编译 dts 以获得 dtb:
dtc -O dtb -o bcm2835-rpi-zero-w.dtb bcm2835-rpi-zero-w.dts
但是编译失败,我得到:
Error: bcm2835-rpi-zero-w.dts:13.1-9 syntax error
FATAL ERROR: Unable to parse input tree
我找不到任何关于 Pi 0 的教程,所有关于第一个 Rapsberry Pi 的教程似乎都已过时。我不确定自己编译 dtb 是否可行。
任何输入将不胜感激,谢谢!
这是行不通的,因为 QEMU 选项“-M versatilepb”表示 "emulate a VersatilePB development board",这不会 运行 旨在在 Pi Zero 上启动的内核。 versatilepb 板在 Pi Zero DTB 文件所说的位置没有设备,因此如果您为内核提供 Pi Zero DTB,那么内核将立即崩溃,因为它无法在预期的位置找到任何东西。
一般来说,Arm 开发板与 x86 不同——它们全都不同,您不能只在不同的开发板上启动一个内核。这实际上就是 "unrecognized machine ID" 错误告诉你的——它来自来宾内核,它说的是 "I can't boot on this board".
您需要:
- 使用 -M versatilepb 并向 QEMU 传递一个内核和 dtb 用于该机器,而不是其他机器
- 使用一些其他的 -M 选项和一个与之一起工作的内核和 dtb(例如,我们现在支持 'raspi2' 用于 RaspberryPi 2 板模型,有一些值得注意的警告,包括 "no USB, no networking")
此外,正如您似乎已经发现的那样,-dtb 需要 DTB 文件(编译后的二进制文件),而不是 DTS 文件(源代码)。
我正在尝试根据我在真实 Raspberry Pi 零 W 上使用的图像使用 Qemu 模拟 Raspberry Pi 零 W。
我使用的命令是:
sudo qemu-system-arm \
-kernel ./qemu-rpi-kernel/kernel-qemu-4.9.59-stretch \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-hda pi_zero_kinetic_raspbian.qcow \
-cpu arm1176 -m 512 \
-M versatilepb \
-no-reboot \
-serial stdio \
-net nic -net user \
-net tap,ifname=vnet0,script=no,downscript=no
但是 Qemu 抱怨 Error: unrecognized/unsupported machine ID (r1 = 0x00000183)
所以添加了这个选项:
-dtb linux/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
但在这种情况下:
qemu-system-arm: Unable to copy device tree in memory
Couldn't open dtb file qemu-rpi-kernel/tools/linux/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
所以我尝试编译 dts 以获得 dtb:
dtc -O dtb -o bcm2835-rpi-zero-w.dtb bcm2835-rpi-zero-w.dts
但是编译失败,我得到:
Error: bcm2835-rpi-zero-w.dts:13.1-9 syntax error
FATAL ERROR: Unable to parse input tree
我找不到任何关于 Pi 0 的教程,所有关于第一个 Rapsberry Pi 的教程似乎都已过时。我不确定自己编译 dtb 是否可行。 任何输入将不胜感激,谢谢!
这是行不通的,因为 QEMU 选项“-M versatilepb”表示 "emulate a VersatilePB development board",这不会 运行 旨在在 Pi Zero 上启动的内核。 versatilepb 板在 Pi Zero DTB 文件所说的位置没有设备,因此如果您为内核提供 Pi Zero DTB,那么内核将立即崩溃,因为它无法在预期的位置找到任何东西。
一般来说,Arm 开发板与 x86 不同——它们全都不同,您不能只在不同的开发板上启动一个内核。这实际上就是 "unrecognized machine ID" 错误告诉你的——它来自来宾内核,它说的是 "I can't boot on this board".
您需要:
- 使用 -M versatilepb 并向 QEMU 传递一个内核和 dtb 用于该机器,而不是其他机器
- 使用一些其他的 -M 选项和一个与之一起工作的内核和 dtb(例如,我们现在支持 'raspi2' 用于 RaspberryPi 2 板模型,有一些值得注意的警告,包括 "no USB, no networking")
此外,正如您似乎已经发现的那样,-dtb 需要 DTB 文件(编译后的二进制文件),而不是 DTS 文件(源代码)。