目标
我想在真实的 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
解决方案:
在主机和来宾之间不同的架构上,添加 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)