Raspberry pi qemu系统臂挂有树莓皮2图像

Raspberry pi qemu系统臂挂有树莓皮2图像,raspberry-pi,qemu,yocto,Raspberry Pi,Qemu,Yocto,我正在尝试在qemu系统arm上运行Yocto Raspberry Pi 2 我走了这么远: $qemu系统arm-版本 QEMU emulator版本2.10.1(Debian 1:2.10+dfsg-0ubuntu3.5) 版权所有(c)2003-2017 Fabrice Bellard和QEMU项目开发商 $qemu系统arm\ -M拉斯皮2\ -cpu arm1176\ -dtb./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb\ -

我正在尝试在
qemu系统arm
上运行Yocto Raspberry Pi 2

我走了这么远:

$qemu系统arm-版本
QEMU emulator版本2.10.1(Debian 1:2.10+dfsg-0ubuntu3.5)
版权所有(c)2003-2017 Fabrice Bellard和QEMU项目开发商
$qemu系统arm\
-M拉斯皮2\
-cpu arm1176\
-dtb./tmp/deploy/images/raspberrypi2/bcm2709-rpi-2-b.dtb\
-sd./tmp/deploy/images/raspberrypi2/berrynux-image-raspberrypi2.rootfs.rpi-sdimg\
-m1g\
-SMP1\
-无图形\
-kernel./kernelqemu\
-追加“rw earlyprintk loglevel=8 console=ttyS0 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2”\
-连载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
所以我改用了(试过拉伸和喘息,结果相同-悬挂)

永远不知道从哪里开始调试,这甚至是试图引导?我能用锤子敲打它给我一些有用的输出吗?我需要特别烘焙的果仁吗?如果需要,从哪里获得

strace
没有给我任何帮助(或者我不知道如何解释输出):

POLLIN
事件每秒无限重复一次

SD卡映像在真正的硬件Pi2上可以正常引导

编辑 我从最新的拉斯宾拉伸图像中复制了
kernel7.img
bcm2709-rpi-2-b.dtb
,我仍然得到了相同的精确悬挂。我开始觉得我的QEMU版本有点不对劲——它是Ubuntu17.10.deb的股票包

编辑#2
从源代码处编译的
qemu-2.12.0-rc2
,相同的交易。我一定是做错了什么事。

当谈到QEMU上的arm时,Yocto正在测试versatilepb机器。因此,其他配置可能存在问题。建议查看脚本中有关如何配置qemu以运行的所有选项。

“什么都没有发生”和“试图从假地址执行”通常是以下两种情况之一的结果:

  • 配置错误的内核(该内核是否一定要在raspi2板上引导,而不是在其他板上引导?)
  • 在内核成功生成输出之前的早期引导中出现了一些错误(尽管这通常会导致挂起而不是错误的地址输出)
对于后者,假设这确实是一个raspi2内核,您可以尝试使用 earlycon=pl011,0x3f201000 在内核中添加参数。(Linux内核可以为PL011 UART生成earlycon输出,但不能为特定于raspi的“迷你UART”生成earlycon输出。)


我建议暂时删除“-nographic”和“-serial mon:stdio”。然后,您可以使用图形用户界面检查两个UART输出。(您可以在不使用GUI的情况下,通过使用两组串行命令行选项正确重定向它们,但随后您必须找到发送它们的合理位置;GUI更简单。)第一个串行端口是PL011,第二个是mini UART,因此,如果您只告诉QEMU将第一个串行端口输出发送到哪里,而来宾正在写入第二个串行端口输出,您将永远看不到它。

有趣的是,当将
kernel7.img
作为
-kernel
传递时,我不再感到QEMU恐慌,但它仍然以完全相同的方式挂起(其他内核也是如此)。如果内核是为versatilepb构建的,这才是一个好主意。如果它是一个合适的raspi2内核,那么它将根本无法工作。相反,如果内核是为versatilepb构建的,那么使用raspi2机器是错误的。重要的是要知道内核用于哪台机器,并告诉QEMU去模拟它。
versatilepb
被限制在256MB的RAM和ARM CPU的v6上,所以这是一个不好的建议,而不是OP要求的删除
-nographic
,连接X11转发,删除了除
root=
之外的所有引导参数,猜猜看,它可以工作!谢谢你,好心的先生。吸取的教训是,
-nographic
能咬人,它确实咬人了。美丽的景象-我相信Pi内核使用帧缓冲区引导,因此它可以显示顶级树莓。。这正是让我恼火的地方,因为我期待着文本引导。我认为,使用正确的内核和QEMU命令行参数,应该可以让它通过文本控制台引导。PS:为了防止您可能陷入不必要的兔子洞,模拟系统将没有网络,因为我们没有模拟raspi网络挂起的USB控制器。
...
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, "\0\0\240\341\0\0\240\341\0\0\240\341\0\0\240\341\0\0\240\341\0\0\240\341\0\0\240\341\0\0\240\341"..., 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, "\320\r\376\355\0\0A5\0\0\0H\0\0;0\0\0\0(\0\0\0\21\0\0\0\20\0\0\0\0"..., 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)