Я не могу ответить на часть о том, где появился диапазон памяти A0000, но я могу ответить на некоторые ваши вопросы.
Как менеджер устройства узнает размер каждой памяти?
На самом деле довольно легко ответить.К сожалению, я не могу связаться с прямым источником, так как у меня нет доступа к спецификации, но я могу объяснить это.До того, как ОС хоста (Windows) выделит адреса для размещения в регистре BAR (пространство конфигурации), на устройстве есть данные, помещенные в регистр BAR.Найденное содержимое - это длина данных, выделяемых для этого BAR. Что такое регистр базовых адресов (BAR) в PCIe? https://en.wikipedia.org/wiki/PCI_configuration_space
считывает запрошенный объем памяти устройства
Теперь с этим сказаноЯ замечаю некоторые странные вещи с вашими BAR, поэтому, пожалуйста, укажите это (https://wiki.osdev.org/PCI) для того, что я говорю. Ваши первые 2 BAR (BAR0 и BAR2) действительно 64-битная памятьBAR, но, в частности, они выбираются заранее. BAR1 и BAR3 - это другая половина 64-битного BAR, которая не используется, что весьма необычно для 64-битных BAR, чтобы тратить это пространство. Далее на BAR4 мы видим, что бит1 установлен, подразумевая, что это пространство ввода-вывода ине пространство памяти. Тогда последний BAR5 Я полагаю, что вы не правы, для меня это выглядит как 32-битное непередаваемое пространство памяти BAR. В моем опыте системы устанавливают BAR на 00000000, когда они не используются, а не на этот случайный адрес.
Теперь, глядя на то, какие окна сообщают, мы видим 4 бара (имеет смысл для меня) .В размере, который он определил при первом чтении BAR (так что у вас нет возможности проверить этоТочка уже изменилась и давно прошла).Однако, как ни странно, ваш адрес ввода-вывода изменился с 0000e000 на .... A0000.Это может быть связано с тем, как работает пространство ввода / вывода. У меня, честно говоря, нет опыта работы с барами пространства ввода / вывода.Но, надеюсь, другая информация поможет.