qemuの起動時に無限ループ

qemuの起動時に無限ループ

現在qemuを実行しているx64ホストでARMv7 Cortex-A8をエミュレートする仮想マシンを設定しようとしています。私はrealview defconfigとrootfsをcpio形式で構築したzImageを持っています。

次のコマンドを実行するとき:

$ 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 コアの数。

私は(コマンドの前にストレスがあります)無限ループ...そしてこれはループ部分です:

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詳細より。いくつかの非常にハッキングされたカーネル(アンドロイドやopenwrtなど)は有効になっていても処理が困難ですearly printk予想されるQEMU合成システムを対象にしないと、中断され、正しくシミュレートされません。

このstrace recvmsg == EAGAINエラーは、バグとは関係ありませんが、ソケットに受信できるデータがない場合に予想される動作です。 qemuプロセスの10 fdがどのオブジェクトを参照しているかを確認する必要があります。 qemu pidを使用して、どのファイルシステムが開いていてlsof -p pidどこからpid来たのかを確認してください。

で終わる一部のシステムコールは、-1 errnoエラーではなく、プロセスが処理するオブジェクトに対するいくつかのイベントを表します。

関連情報