Распределение адресов для устройств PCI обычно выполняется на уровне BIOS. Обратимся к платформе x86. Если мы внимательно посмотрим на систему адресной карте, было бы что-то вроде этого (Изображение взято из BIOS РАЗБОРКОЙ ниндзюцу, по Darmawan Salihun)
На адресной карте, есть специальное пространство для сопоставления Области памяти PCI. То же самое можно было бы воспроизвести с использованием вывода /proc/iomem
.
Эта реализация зависит от платформы, и по мере того, как BIOS «знает» о платформе, она выделяет адреса, предназначенные для слотов PCI. Когда устройство подключено к слоту, BIOS взаимодействует с прошивкой на устройстве и фактически настраивает регионы памяти для устройства, чтобы ОС могла его использовать.
Теперь подходит к части водителя. В Linux драйверы следуют определенному стандарту, известному как «Модель устройств Linux», который представляет собой Core Layer (ядро PCI), драйверы хост-контроллера (PCI Controller/Masters) и клиентские драйверы (устройства PCI). Когда PCI-устройство (клиент) подключено к слоту, соответствующий хост-контроллер знает о вложении, и он далее информирует об этом PCI-ядро и, следовательно, появляется на выходе lspci
.
lspci
показывает устройства, идентифицируемые хост-контроллером, и в этом случае он может быть или не быть привязан к водителю. Ядро далее пересекает драйверы в системе, находит соответствующий и подключается к этому устройству.
Итак, причина, по которой вы видите устройство на выходе lspci
, заключается в том, что главный контроллер идентифицировал устройство и сообщил о ядре PCI. Это не имеет значения, даже если какой-либо драйвер подключен к устройству или нет.