Atualmente, estou tentando configurar uma máquina virtual emulando um ARMv7 Cortex-A8 em um host x64 executando o qemu. Eu tenho um zImage que foi construído com o defconfig realview e um rootfs no formato cpio.
Quando eu executo o seguinte comando:
$ 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
Eu esperaria que o kernel inicializasse e falhasse porque ainda não especifico o rootfs. Em vez disso, ele não gera saída e fica paralisado (usando 100% do núcleo da CPU em que está sendo executado.
Eu descobri (prepending strace para o comando) que ele está preso em um loop infinito ... Aqui está a parte do loop:
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, "$ 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
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, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 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, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 8
read(5, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 512) = 8
ppoll([{fd=5, events=POLLIN|POLLERR|POLLHUP}], 1, {0, 0}, NULL, 8) = 0 (Timeout)
write(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 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, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 16) = 8
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 0 (Timeout)
%pre%%pre%%pre%%pre%%pre%", 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, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 8) = 8
read(5, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 512) = 8
ppoll([{fd=5, events=POLLIN|POLLERR|POLLHUP}], 1, {0, 0}, NULL, 8) = 0 (Timeout)
write(6, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 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, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 16) = 8
ppoll([{fd=4, events=POLLIN|POLLERR|POLLHUP}, {fd=6, events=POLLIN}, {fd=5, events=POLLIN}], 3, {0, 0}, NULL, 8) = 0 (Timeout)
Eu nunca depurei usando strace, mas " recvmsg (10, 0x7ffe1d2a8dd0, 0) = -1 EAGAIN (Recurso temporariamente indisponível) " não parece certo ...
Alguma ideia?
Qualquer ajuda é bem vinda.