표적
저는 부트 로더를 개발 중이고 시뮬레이션 작업 흐름이 훨씬 빠르기 때문에 실제 AArch64 하드웨어에서 AArch64(ARM64)의 부팅 프로세스(모든 부팅 프로세스)를 시뮬레이션하고 싶습니다.
질문
QEMU를 사용하려고 시도할 때마다 검은색 화면이 나타납니다. 부트로더를 실행하고 Linux를 직접 부팅해 보았습니다. 오류 메시지가 없습니다.
다양한 시도
첫 시도:
# sudo apt-get install qemu qemu-system-arm qemu-efi-aarch64 qemu-utils
qemu-system-aarch64 -nographic -machine virt,gic-version=3 -m 512M -smp 4 some-aarch64-linux.iso
# Blank screen. Press ctrl+a c to exit.
두 번째 시도:
# Create an EFI bootloader
dd if=/dev/zero of=flash0.img bs=1M count=64
dd if=/usr/share/qemu-efi-aarch64/QEMU_EFI.fd of=flash0.img conv=notrunc
qemu-system-aarch64 -nographic -machine virt,gic-version=3 -m 512M -smp 4 \
-drive file=flash0.img,format=raw,if=pflash
# Blank screen. Press ctrl+a c to exit.
세 번째 시도:
qemu-img create -f qcow2 alpine.img 8G
wget -O alpine-virt.iso http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/aarch64/alpine-virt-3.12.1-aarch64.iso
sudo kvm -machine virt -hda alpine.img -cdrom alpine-virt.iso -m 512
> KVM is not supported for this guest CPU type
> kvm_init_vcpu failed: Invalid argument
네 번째 시도:
qemu-img create -f qcow2 alpine.img 8G
wget -O alpine-virt.iso http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/aarch64/alpine-virt-3.12.1-aarch64.iso
qemu-system-aarch64 -nographic -machine virt -hda alpine.img -cdrom alpine-virt.iso -m 512
# Blank screen. Press ctrl+a c to exit.
다섯 번째로 x86-64 시스템에서 Docker를 사용해 보십시오.
docker run -it --rm --name qemu-container \
-e QEMU_ARCH=aarch64 \
-e QEMU_HDA=/tmp/hda.qcow2 \
-e QEMU_HDA_SIZE=1G \
-e QEMU_CPU=4 \
-e QEMU_RAM=512 \
-v ${PWD}/alpine-virt-3.12.1-aarch64.iso:/tmp/os.iso:ro \
-e QEMU_CDROM=/tmp/os.iso \
-e QEMU_BOOT='order=d' \
-e QEMU_PORTS='2375 2376' \
tianon/qemu start-qemu -machine virt
# Results:
# + qemu-img create -f qcow2 -o preallocation=off /tmp/hda.qcow2 1G
# Formatting '/tmp/hda.qcow2', fmt=qcow2 cluster_size=65536 preallocation=off compression_type=zlib size=1073741824 lazy_refcounts=off refcount_bits=16
# + exec qemu-system-aarch64 -smp 4 -m 512 -drive file=/tmp/hda.qcow2,index=0,media=disk,discard=unmap,detect-zeroes=unmap,if=none,id=hda -device virtio-scsi-pci -device scsi-hd,drive=hda -cdrom /tmp/os.iso -boot order=d -netdev user,hostname=30047d3b64c0,hostfwd=tcp::22-:22,hostfwd=udp::22-:22,hostfwd=tcp::2375-:2375,hostfwd=udp::2375-:2375,hostfwd=tcp::2376-:2376,hostfwd=udp::2376-:2376,id=net -device virtio-net-pci,netdev=net -serial stdio -vnc :0
# Frozen. Press ctrl+c to send a signal
이전 연구들:
- Qemu 및 AARCH64(그래서 부적절한 명령이 사용되었습니다)
- QEMU AArch64가 로그 메시지 없이 중단된 것 같습니다.(SO는 부적절한 아키텍처를 사용합니다)
- https://linuxhint.com/install_qemu_debian/(같은 검은 화면)
- https://futurewei-cloud.github.io/ARM-Datacenter/qemu/how-to-launch-aarch64-vm/(같은 검은 화면)
답변1
실패하다(빈 화면이 나타남):
qemu-system-aarch64 \
-machine virt \
-serial stdio \
-bios u-boot.bin
성공(부트로더 실행 중):
qemu-system-aarch64 \
-machine virt \
-serial stdio \
-cpu cortex-a53 \
-bios u-boot.bin
해결책:
호스트와 게스트 간의 서로 다른 아키텍처에서는 QEMU가 기본적으로 호스트 CPU 가상화를 사용하지 않도록 CPU 플래그를 추가합니다.
-cpu cortex-a53
존재하다정확히 똑같다호스트 하드웨어를 에뮬레이션하는 경우(x86-64 에뮬레이션/하드웨어가 아닌 경우) 이 플래그는 필요하지 않지만 제 경우에는 필요합니다. 실제 AArch64 하드웨어에서 AArch64를 에뮬레이트하는 QEMU에 이 매개변수를 추가하면 부트로더가 실행되어 콘솔에 출력을 표시할 수 있습니다.
~$ qemu-system-aarch64 -machine virt -serial stdio -cpu cortex-a53 -bios u-boot.bin
U-Boot 2021.01-rc1-g896cc5aa (Nov 06 2020 - 23:33:35 -0800)
DRAM: 128 MiB
Flash: 128 MiB
*** Warning - bad CRC, using default environment
In: pl011@9000000
Out: pl011@9000000
Err: pl011@9000000
Net: No ethernet found.
Hit any key to stop autoboot: 0
starting USB...
No working controllers found
USB is stopped. Please issue 'usb start' first.
scanning bus for devices...
...
달리기 qemu-system-aarch64 -cpu help
:
Available CPUs:
arm1026
arm1136
arm1136-r2
arm1176
arm11mpcore
arm926
arm946
cortex-a15
cortex-a53
cortex-a57
cortex-a7
cortex-a8
cortex-a9
cortex-m3
cortex-m4
cortex-r5
pxa250
pxa255
pxa260
pxa261
pxa262
pxa270-a0
pxa270-a1
pxa270
pxa270-b0
pxa270-b1
pxa270-c0
pxa270-c5
sa1100
sa1110
ti925t
host (only available in KVM mode)