AArch64/ARM64 上的 QEMU 和黑屏

AArch64/ARM64 上的 QEMU 和黑屏

目标

我想在真实的 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

先前的研究:

答案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

解决方案:

在主机和来宾之间不同的架构上,添加 CPU 标志,以便 QEMU 不会默认为主机 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)

相关内容