Arm64架构QEMU模拟UEFI Shell无响应及启动失败求助
问题分析与解决办法
1. UEFI Shell无响应
原因:
QEMU命令中使用了-S参数,该参数会让QEMU启动后暂停CPU执行,必须等待GDB连接并发送continue指令后才会继续运行。此时UEFI Shell处于完全停滞状态,输入任何命令都不会触发响应。另外,你提供的GDB命令存在拼写错误:set architechture aarch64应为set architecture aarch64,错误指令会导致GDB无法正确识别目标架构。
解决办法:
- 临时恢复:在GDB连接成功后,执行
continue(可简写为c)命令,让CPU恢复运行,此时UEFI Shell即可正常响应输入。 - 永久修正:如果不需要启动时强制暂停调试,直接移除QEMU命令中的
-S参数;同时修正GDB中的架构拼写错误。
2. BdsDxe: failed to load Boot0001错误
原因:
- 引导方式冲突:你同时启用了QEMU原生
-kernel直接加载内核,和UEFI固件引导流程。这两种方式互斥——-kernel参数会绕过UEFI固件,直接让QEMU加载并执行内核,而UEFI仍会按自身引导项规则查找可引导设备,自然找不到对应项而报错。 - 无效磁盘配置:
-drive file=myKernel.img仅指定了文件路径,但未定义磁盘接口、格式,UEFI无法将“裸”内核镜像识别为可引导存储设备。UEFI要求的是包含ESP(EFI系统分区)的磁盘镜像,且分区内存放符合UEFI规范的EFI二进制文件(如bootaa64.efi)。
解决办法:
方案一:使用UEFI原生引导(推荐)
- 移除QEMU命令中的
-kernel=myKernel.img参数,消除引导流程冲突。 - 将内核打包为UEFI可引导磁盘镜像:
- 创建空白镜像:
qemu-img create -f raw uefi_disk.img 1G - 分区与格式化:用
gdisk创建GPT分区表,添加类型代码为EF00的ESP分区,将分区格式化为FAT32。 - 部署引导文件:将内核编译为UEFI应用(生成
.efi格式文件),放入ESP分区的EFI/BOOT/目录下,并重命名为bootaa64.efi(UEFI默认查找的引导文件名)。
- 创建空白镜像:
- 在QEMU命令中添加该磁盘镜像:
-drive if=virtio,format=raw,file=uefi_disk.img
(使用virtio接口可获得更好性能,UEFI原生支持该类型设备)
方案二:保留-kernel参数(跳过UEFI引导)
如果仅需测试内核而非UEFI环境,可以移除两个-drive if=pflash的UEFI固件参数,仅保留-kernel参数,此时QEMU会直接引导内核,无需依赖UEFI。
修正后的完整QEMU命令(方案一示例)
qemu-system-aarch64 \ -m 4G -cpu cortex-a76 \ -machine virt,mte=off,virtualization=on,gic-version=3 \ -display gtk,show-tabs=on,show-cursor=on -device ramfb \ -drive if=pflash,format=raw,unit=0,file=firmware/uefi/AARCH64_OVMF_CODE.fd,readonly=on \ -drive if=pflash,format=raw,unit=1,file=firmware/uefi/AARCH64_OVMF_VARS.fd \ -drive if=virtio,format=raw,file=uefi_disk.img \ -serial stdio -s -rtc base=localtime,clock=host,driftfix=none -smp 8,sockets=2 & gdb-multiarch \ -ex "set architecture aarch64" \ -ex "file myKernel.elf" \ -ex "target remote 127.0.0.1:1234"
内容的提问来源于stack exchange,提问作者CorkiMain
相关产品推荐
相关产品推荐

