You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

aarch64 virt环境下QEMU未传递FDT指针的原因及获取方法

QEMU未传递FDT指针的原因及解决方法

原因分析

你的场景中X0寄存器值为0,核心原因分为两种情况:

  1. 内核类型不匹配QEMU默认逻辑:当使用-kernel加载ELF文件时,QEMU仅对符合Linux内核启动规范的ELF自动生成并传递FDT指针到X0。如果mykernel.elf是自定义裸机程序,QEMU不会执行这个传递逻辑。
  2. QEMU未自动生成/加载FDT:即使是Linux内核,旧版本QEMU在virt机器配置下可能存在自动生成FDT的bug,或者你的机器参数组合(如virtualization=on,secure=off)导致自动生成逻辑未触发。

解决方法

情况1:你的内核是Linux内核

  • 手动生成并指定DTB:
    1. 先让QEMU生成对应virt机器的DTB文件:
      qemu-system-aarch64 -machine virt,gic_version=2,virtualization=on,secure=off -cpu cortex-a72 -m 2G -dumpdtb virt.dtb
      
    2. 启动时添加-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
      
    3. 重新启动后用gdb检查X0,此时应该会指向FDT的物理地址。
  • 升级QEMU版本:如果使用的是较旧的QEMU(比如低于5.0版本),升级到最新稳定版,修复自动生成FDT的潜在bug。

情况2:你的内核是自定义裸机程序

  • 指定DTB并手动定位:
    1. 同样先生成DTB文件(步骤同上),启动时添加-dtb virt.dtb参数。
    2. 在gdb中通过搜索FDT魔数0xd00dfeed找到其物理地址:
      x/4wx 0x80000000 0x10000000  # 搜索2G内存范围内的魔数,地址范围可根据你的-m参数调整
      
      找到魔数所在地址后,即可在裸机代码中使用该地址访问FDT。
    3. 若需要自动传递到X0,你可以修改QEMU的启动脚本,或者在裸机代码的入口处硬编码FDT地址(virt机器默认会将DTB加载到物理内存的高位区域,比如靠近-m指定的内存上限位置)。

内容的提问来源于stack exchange,提问作者Alan Mimms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:20:09