Мой опыт работы с процессорами Intel, поэтому некоторые подробности ниже могут относиться к процессорам Intel, но в основном это общие сведения. Также я не знаю деталей того, как Linux определяет драйвер для загрузки для каждого устройства, поэтому я пропустил этот вопрос.
Современные процессоры не имеют системную шину (кроме скрытыхвнутри самого процессора). Они имеют каналы памяти, корневые порты PCIe и порт DMI, который подключается к чипсету (также называемый концентратором периферийного контроллера или PCH). PCH содержит дополнительные устройства и может иметь дополнительные корневые порты. Корневой комплекс состоит из схем, интегрированных как в CPU, так и в PCH. (Некоторые процессорные SoC не имеют DMI или PCH, и все корневые сложные схемы находятся внутри SoC CPU.)
Даже если ваша карта является единственной картой PCIe во всей системе, существуют другие PCIeустройства, интегрированные в корневой комплекс (называемые RCIEP или интегрированные конечные точки корневого комплекса). Они могут находиться в ЦП или в PCH.
Ваше устройство, подключенное к корневому порту PCIe, будет настроено как устройство 0 на некотором ненулевом номере шины. Номер шины зависит от корневого порта PCIe (т. Е. Слота), к которому подключено устройство, и способа, которым BIOS конфигурирует шину PCIe. (Как правило, один и тот же слот будет иметь один и тот же номер шины, но это может быть не так, в зависимости от того, что подключено к другим корневым портам PCIe.)
Остальные ваши предположения и терминология в порядке.
Программное обеспечение обращается к пространству конфигурации PCI либо с помощью инструкций ввода / вывода к портам ввода-вывода 0xcf8 и 0xcfc, либо с помощью пространства конфигурации с отображением в памяти. Диапазон адресов памяти пространства конфигурации PCI устанавливается BIOS. Программное обеспечение узнает адрес, просматривая таблицы ACPI. Механизм, с помощью которого эти входы / выходы или доступ к памяти преобразуются в сигналы PCIe, полностью находится внутри аппаратного обеспечения корня.
Смещение в диапазоне адресов пространства конфигурации PCI определяет, к какому программному обеспечению устройства / регистра осуществляется доступ. Например, доступ к MMCFG + 0 осуществляет доступ к смещению регистра 0 устройства 0: 0.0. Доступ к MMCFG + 0x1000 обращается к смещению регистра 0 устройства 0: 0.1, а доступ к MMCFG + 0x102000 обращается к смещению 0 регистра устройства 1: 0.2.
Программное обеспечение считывает регистры идентификатора поставщика / идентификатора устройства со смещением3: 0 каждого адреса устройства, чтобы определить, существует ли устройство по этому адресу. Если устройства нет, контроллер PCI возвращает 0xffffffff. Если устройство присутствует, оно возвращает идентификатор поставщика и идентификатор устройства, что позволяет программному обеспечению определять тип устройства.
Каждое устройство имеет 6 регистров BAR, со смещением 0x10, 0x14, ... 0x24. Если устройство поддерживает 64-битные BAR, два соседних регистра BAR используются для настройки одного региона. Обычно BIOS конфигурирует BAR каждого устройства, а также настраивает другие (скрытые) регистры внутри корневого комплекса, чтобы позволить ему перенаправлять доступ к памяти на соответствующее устройство. Обычно программное обеспечение записывает данные в регистры BAR для определения размера региона, а затем восстанавливает значения, установленные BIOS. В зависимости от корневого сложного аппаратного обеспечения, программное обеспечение может или не может изменять значения BAR, и при этом доступы работают правильно.