Arm 在QEMU AArch64 virt设备上访问ECAM

Arm 在QEMU AArch64 virt设备上访问ECAM,arm,qemu,arm64,osdev,pci-e,Arm,Qemu,Arm64,Osdev,Pci E,我正在尝试在QEMU AArch64 virt设备上实现裸机PCIE设备发现。我知道,ECAM区域映射到0x3f000000内存地址,我希望在那里看到 但当我从0x3f000000地址读取4字节MCFG签名时,我得到一个同步异常 我做错了什么?在访问PCIE内存映射区域之前,是否需要执行某些操作 QEMU_CMD = qemu-system-aarch64 \ -machine virt \ -m 1024M \ -cpu cortex-a53 \ -serial

我正在尝试在QEMU AArch64 virt设备上实现裸机PCIE设备发现。我知道,ECAM区域映射到0x3f000000内存地址,我希望在那里看到

但当我从0x3f000000地址读取4字节MCFG签名时,我得到一个同步异常

我做错了什么?在访问PCIE内存映射区域之前,是否需要执行某些操作

QEMU_CMD = qemu-system-aarch64 \
    -machine virt \
    -m 1024M \
    -cpu cortex-a53 \
    -serial stdio \
    -device virtio-gpu-pci \
    -vnc :0 \
    -netdev user,id=n1 -device virtio-net-pci,netdev=n1

你找错地址了。virt板仅将ECAM置于0x3f00_0000地址,前提是它未使用高于-4GB的物理地址空间,这不是默认值;QEMU仅在用户通过-machine highmem=off时才避免使用highmem

您可以通过要求QEMU转储dtb而不是运行来宾来检查这一点,方法是将-machine dumpdtb=/tmp/dump.dtb添加到命令行,然后使用dtc-I dtb-O dts/tmp/dump.dtb | less分解dtb,并查看pci控制器的dtb


更一般地说,QEMU virt板中运行的客户机不应硬编码设备的任何地址,但应始终读取QEMU生成并传递给客户机的dtb,以确定设备在地址空间中的位置。如果您的代码执行了此操作,它就不会遇到此错误。

什么是QEMU命令行?@unixsmurf添加到帖子的bodyabout device tree中,这正是我所做的。似乎我误解了你的意思。现在正在研究:但仍然不知道如何计算正确的基址