qemu-system-arm 挂起 Raspberry Pi 2 图片
qemu-system-arm hangs with Raspberry Pi 2 image
我正在尝试 运行 基于 qemu-system-arm
的 Yocto Raspberry Pi 2。
我走到这一步:
$ qemu-system-arm -version
QEMU emulator version 2.10.1(Debian 1:2.10+dfsg-0ubuntu3.5)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
$ qemu-system-arm \
-M raspi2 \
-cpu arm1176 \
-dtb ./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb \
-sd ./tmp/deploy/images/raspberrypi2/berrynux-image-raspberrypi2.rootfs.rpi-sdimg \
-m 1G \
-smp 1 \
-nographic \
-kernel ./kernel-qemu \
-append "rw earlyprintk loglevel=8 console=ttyS0 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
-serial mon:stdio
执行挂起:
WARNING:
Image format was not specified for
'./tmp/deploy/images/raspberrypi2/berrynux-image-raspberrypi2.rootfs.rpi-sdimg' and probing guessed raw.
Automatically detecting the format is dangerous for
raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
由 meta-raspberrypi (kernel7.img) 生成的内核立即破坏 qemu:
qemu-system-arm: Trying to execute code outside RAM or ROM at 0xe0833006
所以我改用 kernel-qemu-4.4.34-jessie
(尝试了 stretch 和 wheezy,结果相同 - 挂起)
不知道从哪里开始调试,这是在尝试启动吗?我可以锤它给我一些有用的输出吗?我需要一个特别烘焙的内核吗?如果需要,我从哪里得到它?
strace
没让我明白(或者我不知道如何解释输出):
...
openat(AT_FDCWD, "./kernel-qemu-4.4.34-jessie", O_RDONLY) = 11
lseek(11, 0, SEEK_END) = 3024048
mmap(NULL, 3026944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4ed8106000
lseek(11, 0, SEEK_SET) = 0
read(11, "[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01"..., 3024048) = 3024048
close(11) = 0
access("./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb", R_OK) = 0
openat(AT_FDCWD, "./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb", O_RDONLY) = 11
lseek(11, 0, SEEK_END) = 16693
close(11) = 0
openat(AT_FDCWD, "./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb", O_RDONLY) = 11
lseek(11, 0, SEEK_END) = 16693
lseek(11, 0, SEEK_SET) = 0
read(11, "0\r65[=14=][=14=]A5[=14=][=14=][=14=]H[=14=][=14=];0[=14=][=14=][=14=]([=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=]"..., 16693) = 16693
close(11) = 0
futex(0x563f38608c3c, FUTEX_WAKE_PRIVATE, 2147483647) = 1
futex(0x563f383d040c, FUTEX_WAKE_PRIVATE, 2147483647) = 1
futex(0x563f384305cc, FUTEX_WAKE_PRIVATE, 2147483647) = 1
ppoll([{fd=0, events=POLLIN}, {fd=3, events=POLLIN}, {fd=5, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}], 5, {tv_sec=0, tv_nsec=0}, NULL, 8) = 0 (Timeout)
futex(0x563f372cac00, FUTEX_WAKE_PRIVATE, 1) = 1
ppoll([{fd=0, events=POLLIN}, {fd=3, events=POLLIN}, {fd=5, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}], 5, {tv_sec=1, tv_nsec=0}, NULL, 8) = 0 (Timeout)
ppoll([{fd=0, events=POLLIN}, {fd=3, events=POLLIN}, {fd=5, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}], 5, {tv_sec=1, tv_nsec=0}, NULL, 8) = 0 (Timeout)
POLLIN
事件每秒无限重复。
SD 卡映像在真实硬件 Pi2 上启动得很好。
编辑
我从最新的 Raspbian Stretch 图像复制了 kernel7.img
和 bcm2709-rpi-2-b.dtb
,我仍然得到完全相同的挂起。我开始认为我的 QEMU 构建有些问题 - 这是库存 Ubuntu 17.10 .deb 包。
编辑#2
从源代码编译 qemu-2.12.0-rc2
,同样的交易。我一定是做错了什么。
当谈到 arm 上的 QEMU 时,Yocto 已针对 versatilepb 机器进行了测试。因此,其他配置可能存在问题。建议查看 runqemu 脚本以了解有关如何将 qemu 配置为 运行.
的所有选项
"Nothing happens" 和 "tried to execute from a bogus address" 通常是以下任一结果:
- 错误配置的内核(这个内核是否明确打算在 raspi2 板上启动,而不是在其他东西上启动?)
- 在内核设法产生输出之前的早期引导中出现问题(尽管通常这会导致挂起而不是 bad-address 输出)
对于后者,假设这确实是一个 raspi2 内核,您可以尝试使用
earlycon=pl011,0x3f201000
在你的内核附加参数中。 (Linux 内核可以为 PL011 UART 生成 earlycon 输出,但不能为 raspi-specific 'mini UART'。)
我建议暂时删除“-nographic”和“-serial mon:stdio”。然后您可以使用图形 UI 检查两个 UART 输出。 (您可以在不使用 GUI 的情况下执行此操作,方法是使用两个大量的 -serial 命令行选项正确地重定向它们,但是您必须找出发送它们的合理位置;GUI'更简单。)第一个串行端口将是 PL011,第二个串行端口将是 mini-UART,因此如果您只告诉 QEMU 将第一个串行端口输出发送到哪里,而访客正在写入第二个串行端口,您将永远不会看到了。
我正在尝试 运行 基于 qemu-system-arm
的 Yocto Raspberry Pi 2。
我走到这一步:
$ qemu-system-arm -version
QEMU emulator version 2.10.1(Debian 1:2.10+dfsg-0ubuntu3.5)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
$ qemu-system-arm \
-M raspi2 \
-cpu arm1176 \
-dtb ./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb \
-sd ./tmp/deploy/images/raspberrypi2/berrynux-image-raspberrypi2.rootfs.rpi-sdimg \
-m 1G \
-smp 1 \
-nographic \
-kernel ./kernel-qemu \
-append "rw earlyprintk loglevel=8 console=ttyS0 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
-serial mon:stdio
执行挂起:
WARNING:
Image format was not specified for
'./tmp/deploy/images/raspberrypi2/berrynux-image-raspberrypi2.rootfs.rpi-sdimg' and probing guessed raw.
Automatically detecting the format is dangerous for
raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
由 meta-raspberrypi (kernel7.img) 生成的内核立即破坏 qemu:
qemu-system-arm: Trying to execute code outside RAM or ROM at 0xe0833006
所以我改用 kernel-qemu-4.4.34-jessie
(尝试了 stretch 和 wheezy,结果相同 - 挂起)
不知道从哪里开始调试,这是在尝试启动吗?我可以锤它给我一些有用的输出吗?我需要一个特别烘焙的内核吗?如果需要,我从哪里得到它?
strace
没让我明白(或者我不知道如何解释输出):
...
openat(AT_FDCWD, "./kernel-qemu-4.4.34-jessie", O_RDONLY) = 11
lseek(11, 0, SEEK_END) = 3024048
mmap(NULL, 3026944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4ed8106000
lseek(11, 0, SEEK_SET) = 0
read(11, "[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01[=14=][=14=]01"..., 3024048) = 3024048
close(11) = 0
access("./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb", R_OK) = 0
openat(AT_FDCWD, "./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb", O_RDONLY) = 11
lseek(11, 0, SEEK_END) = 16693
close(11) = 0
openat(AT_FDCWD, "./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb", O_RDONLY) = 11
lseek(11, 0, SEEK_END) = 16693
lseek(11, 0, SEEK_SET) = 0
read(11, "0\r65[=14=][=14=]A5[=14=][=14=][=14=]H[=14=][=14=];0[=14=][=14=][=14=]([=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=][=14=]"..., 16693) = 16693
close(11) = 0
futex(0x563f38608c3c, FUTEX_WAKE_PRIVATE, 2147483647) = 1
futex(0x563f383d040c, FUTEX_WAKE_PRIVATE, 2147483647) = 1
futex(0x563f384305cc, FUTEX_WAKE_PRIVATE, 2147483647) = 1
ppoll([{fd=0, events=POLLIN}, {fd=3, events=POLLIN}, {fd=5, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}], 5, {tv_sec=0, tv_nsec=0}, NULL, 8) = 0 (Timeout)
futex(0x563f372cac00, FUTEX_WAKE_PRIVATE, 1) = 1
ppoll([{fd=0, events=POLLIN}, {fd=3, events=POLLIN}, {fd=5, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}], 5, {tv_sec=1, tv_nsec=0}, NULL, 8) = 0 (Timeout)
ppoll([{fd=0, events=POLLIN}, {fd=3, events=POLLIN}, {fd=5, events=POLLIN}, {fd=7, events=POLLIN}, {fd=8, events=POLLIN}], 5, {tv_sec=1, tv_nsec=0}, NULL, 8) = 0 (Timeout)
POLLIN
事件每秒无限重复。
SD 卡映像在真实硬件 Pi2 上启动得很好。
编辑
我从最新的 Raspbian Stretch 图像复制了 kernel7.img
和 bcm2709-rpi-2-b.dtb
,我仍然得到完全相同的挂起。我开始认为我的 QEMU 构建有些问题 - 这是库存 Ubuntu 17.10 .deb 包。
编辑#2
从源代码编译 qemu-2.12.0-rc2
,同样的交易。我一定是做错了什么。
当谈到 arm 上的 QEMU 时,Yocto 已针对 versatilepb 机器进行了测试。因此,其他配置可能存在问题。建议查看 runqemu 脚本以了解有关如何将 qemu 配置为 运行.
的所有选项"Nothing happens" 和 "tried to execute from a bogus address" 通常是以下任一结果:
- 错误配置的内核(这个内核是否明确打算在 raspi2 板上启动,而不是在其他东西上启动?)
- 在内核设法产生输出之前的早期引导中出现问题(尽管通常这会导致挂起而不是 bad-address 输出)
对于后者,假设这确实是一个 raspi2 内核,您可以尝试使用 earlycon=pl011,0x3f201000 在你的内核附加参数中。 (Linux 内核可以为 PL011 UART 生成 earlycon 输出,但不能为 raspi-specific 'mini UART'。)
我建议暂时删除“-nographic”和“-serial mon:stdio”。然后您可以使用图形 UI 检查两个 UART 输出。 (您可以在不使用 GUI 的情况下执行此操作,方法是使用两个大量的 -serial 命令行选项正确地重定向它们,但是您必须找出发送它们的合理位置;GUI'更简单。)第一个串行端口将是 PL011,第二个串行端口将是 mini-UART,因此如果您只告诉 QEMU 将第一个串行端口输出发送到哪里,而访客正在写入第二个串行端口,您将永远不会看到了。