현재 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 코어 수입니다.
나는 (명령 앞에 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
자세히보다. 일부 매우 해킹적인 커널(예: android 및 openwrt)은 활성화되어 있어도 처리하기 어렵습니다 early printk
.예상되는QEMU 합성 시스템을 대상으로 하지 않으면 중단되고 올바르게 시뮬레이션되지 않습니다.
이 strace
recvmsg == EAGAIN
오류는 버그와 관련이 없지만 소켓에 수신할 수 있는 데이터가 없을 때 예상되는 동작입니다. qemu 프로세스의 10 fd가 어떤 객체를 참조하는지 확인해야 합니다. qemu pid를 사용하여 어떤 파일 시스템이 열려 있고 lsof -p pid
어디서 pid
왔는지 확인하세요.
로 끝나는 일부 시스템 호출은 -1 errno
오류가 아니라 프로세스에서 처리하는 개체에 대한 일부 이벤트를 나타냅니다.