我跑步
qemu-system-aarch64 -s -S \
-machine virt,gic_version=2,virtualization=on,secure=off \
-cpu cortex-a72 \
-m 2G \
-kernel mykernel.elf \
\
-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-multiarch
和 target remote :1234
连接到最初停止的访客。使用 info reg
我看到寄存器 X0 为零。我一直以这种方式使用 gdb 进行调试,单步调试内核等,已经持续了数周,并取得了巨大成功。我确信它显示的是真实的寄存器值。
为什么 qemu 不将 FDT 指针传递给 guest 虚拟机?我如何获得 FDT?
https://www.qemu.org/docs/master/system/arm/virt.html#hardware-configuration-information-for-bare-metal-programming的文档说:
QEMU 支持两种类型的 virt 虚拟机映像启动,并且虚拟机代码定位 dtb 二进制文件的方式不同:您正在传递一个 ELF 文件,因此您是这两个类别中的第二个。您将在 0x4000_0000 处找到 DTB(假设您的 ELF 文件已链接,因此它不会与该内存范围重叠)。地址不是在寄存器中传递的:它只是位于已知位置。
- 对于使用 Linux 内核引导协议的客户机(这意味着传递给 QEMU -kernel 选项的任何非 ELF 文件),DTB 的地址在寄存器中传递(对于 32 位客户机,为 r2;对于 64 位客户机,则为 x0)客人)
- 对于以“裸机”(任何其他类型的启动)启动的来宾,DTB 位于 RAM 的开头 (0x4000_0000)