aarch64 virt环境下QEMU未传递FDT指针的原因及获取方法
QEMU未传递FDT指针的原因及解决方法
原因分析
你的场景中X0寄存器值为0,核心原因分为两种情况:
- 内核类型不匹配QEMU默认逻辑:当使用
-kernel加载ELF文件时,QEMU仅对符合Linux内核启动规范的ELF自动生成并传递FDT指针到X0。如果mykernel.elf是自定义裸机程序,QEMU不会执行这个传递逻辑。 - QEMU未自动生成/加载FDT:即使是Linux内核,旧版本QEMU在
virt机器配置下可能存在自动生成FDT的bug,或者你的机器参数组合(如virtualization=on,secure=off)导致自动生成逻辑未触发。
解决方法
情况1:你的内核是Linux内核
- 手动生成并指定DTB:
- 先让QEMU生成对应
virt机器的DTB文件:qemu-system-aarch64 -machine virt,gic_version=2,virtualization=on,secure=off -cpu cortex-a72 -m 2G -dumpdtb virt.dtb - 启动时添加
-dtb virt.dtb参数,修改后的完整命令:qemu-system-aarch64 -s -S \ -machine virt,gic_version=2,virtualization=on,secure=off \ -cpu cortex-a72 \ -m 2G \ -kernel mykernel.elf \ -dtb virt.dtb \ -chardev stdio,mux=on,id=char0 \ -mon chardev=char0,mode=readline \ -serial chardev:char0 \ -device virtio-net-pci,mac=ca:fe:00:ba:be:01,netdev=net0 \ -netdev bridge,br=br0,id=net0 \ -nographic \ -device virtio-gpu-pci \ -device virtio-rng-pci - 重新启动后用gdb检查X0,此时应该会指向FDT的物理地址。
- 先让QEMU生成对应
- 升级QEMU版本:如果使用的是较旧的QEMU(比如低于5.0版本),升级到最新稳定版,修复自动生成FDT的潜在bug。
情况2:你的内核是自定义裸机程序
- 指定DTB并手动定位:
- 同样先生成DTB文件(步骤同上),启动时添加
-dtb virt.dtb参数。 - 在gdb中通过搜索FDT魔数
0xd00dfeed找到其物理地址:
找到魔数所在地址后,即可在裸机代码中使用该地址访问FDT。x/4wx 0x80000000 0x10000000 # 搜索2G内存范围内的魔数,地址范围可根据你的-m参数调整 - 若需要自动传递到X0,你可以修改QEMU的启动脚本,或者在裸机代码的入口处硬编码FDT地址(
virt机器默认会将DTB加载到物理内存的高位区域,比如靠近-m指定的内存上限位置)。
- 同样先生成DTB文件(步骤同上),启动时添加
内容的提问来源于stack exchange,提问作者Alan Mimms
相关产品推荐
相关产品推荐

