qemu 启动时无限循环

qemu 启动时无限循环

我目前正在尝试在运行 qemu 的 x64 主机上设置模拟 ARMv7 Cortex-A8 的虚拟机。我有一个 zImage,它是用 realview defconfig 和 cpio 格式的 rootfs 构建的。

当我运行以下命令时:

$ qemu-system-arm -machine realview-pb-a8 -cpu cortex-a8 -m 256 -kernel zImage
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument

我希望内核初始化然后崩溃,因为我还没有指定 rootfs。相反,它不提供任何输出并挂在那里(,使用100%它所运行的 CPU 核心的数量。

我发现(在命令前面加上 strace)它被困在一个无限循环...这是循环部分:

tgkill(14936, 14937, SIGUSR1)           = 0
futex(0x7faef8beb1e0, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x7faef8beb1a0, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x7faef8beb1a0, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7faef8beb1a4, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x7faef8beb1e0, 254) = 0
recvmsg(10, 0x7ffe1d2a8dd0, 0)          = -1 EAGAIN (Resource temporarily unavailable)
select(11, [10], NULL, NULL, {0, 0})    = 0 (Timeout)
write(5, "\1\0\0\0\0\0\0\0", 8)         = 8
futex(0x7faef8beb1e0, FUTEX_WAKE_PRIVATE, 1) = 0
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 29609869}, NULL, 8) = 1 ([{fd=5, revents=POLLIN}], left {0, 29606726})
write(6, "\1\0\0\0\0\0\0\0", 8)         = 8
read(5, "\1\0\0\0\0\0\0\0", 512)        = 8
ppoll([{fd=5, events=POLLIN|POLLERR|POLLHUP}], 1, {0, 0}, NULL, 8) = 0 (Timeout)
write(6, "\1\0\0\0\0\0\0\0", 8)         = 8
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 1 ([{fd=6, revents=POLLIN}], left {0, 0})
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 1 ([{fd=6, revents=POLLIN}], left {0, 0})
read(6, "\2\0\0\0\0\0\0\0", 16)         = 8
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 0 (Timeout)

我从未使用 strace 进行过调试,但是“recvmsg(10, 0x7ffe1d2a8dd0, 0) = -1 EAGAIN(资源暂时不可用)“看起来不太对劲……

任何想法 ?欢迎任何帮助。

答案1

QEMU 模拟合成机器,但它们并不是真实机器的严格副本。如果 Linux 内核不喜欢这种情况,它可能会提前崩溃或挂起,因为它不知道预期架构中的突然变化。

您可以尝试通过内核机制来解决问题early printk,并尝试将控制台重定向到模拟串行设备(如果目标支持的话)。qemu-doc.html详情请参阅。请注意,一些非常 hackish 的内核(例如 android 和 openwrt)很难处理,即使它们已early printk启用,因此它们预期的如果它们不针对 QEMU 合成机器,则会挂起并且无法正确模拟。

strace recvmsg == EAGAIN错误与错误无关,而是套接字上没有可用数据可供接收时的预期行为。您需要查看 qemu 进程的 10 fd 引用了哪个对象。使用lsof -p pid, where pidis a qemu pid 来查看打开的文件系统以及它们来自哪里。

某些以 结尾的系统调用-1 errno不是错误,而是通过这种方式指示进程处理的对象上的一些事件。

相关内容