Вы смотрите не по адресу. Плата virt помещает ECAM по адресу 0x3f00_0000 только в том случае, если она не использует физическое адресное пространство выше 4 ГБ (что не является значением по умолчанию; QEMU избегает использования highmem только в том случае, если пользователь передал -machine highmem = off).
Вы можете проверить это, попросив QEMU сбросить dtb вместо запуска гостя, добавив «-machine dumpdtb = / tmp / dump.dtb» в командную строку, а затем разобрав dtb с помощью «dt c -I dtb» -O dts /tmp/dump.dtb | less "и просмотрев dtb для контроллера pci.
В более общем смысле, гостевой компьютер, работающий на плате QEMU" virt ", не должен жестко кодировать адреса устройств, но всегда следует читать dtb, который QEMU генерирует и передает гостю, чтобы определить, где в адресном пространстве размещены устройства. Если бы ваш код делал это, он бы не столкнулся с этой ошибкой.