Как регистр базовых адресов получает адрес?

Я закончил разработку драйвера pcie для ПЛИС под дистрибутивом Linux. Все отлично работает Но мне интересно, где регистр базового адреса в конечной точке PCI FPGA получает базовый адрес. Когда я сгенерировал конечную точку PCIe, я смог установить длину BAR, но не более.

В драйвере PCIe я выполняю стандартные функции, такие как pci_enable_device, но я не устанавливаю конкретно базовый адрес.

Так операционная система устанавливает базовый адрес во время запуска? или как это работает? Кроме того, я хотел бы знать, какие инициализации операционная система вообще делает, если подключено устройство pcie pcie. Так как я вижу свое устройство pci в lspci, даже если драйвер выгружен.

С наилучшими пожеланиями Томас

2 ответа

Распределение адресов для устройств PCI обычно выполняется на уровне BIOS. Давайте обратимся к платформе x86. Если мы внимательно посмотрим на системную адресную карту, это будет что-то вроде этого (изображение взято с BIOS DISASSEMBLY NINJUTSU, автор Darmawan Salihun)

На адресной карте есть выделенное пространство для отображения областей памяти PCI. То же самое можно воспроизвести, используя вывод /proc/iomem,

Эта реализация зависит от платформы, и, поскольку BIOS "знает" о платформе, она отложит адреса, выделенные для слотов PCI. Когда устройство подключено к слоту, BIOS взаимодействует с микропрограммой на устройстве и фактически устанавливает области памяти для устройства, чтобы ОС могла использовать его.

Теперь перейдем к части водителей. В Linux драйверы следуют определенному стандарту, известному как "Модель устройства Linux", который состоит из базового уровня (ядро PCI), драйверов хост-контроллера (PCI-контроллера / мастеров) и клиентских драйверов (устройств PCI). Когда устройство PCI (клиент) подключено к разъему, соответствующий хост-контроллер узнает о подключении и дополнительно информирует об этом ядро ​​PCI и, следовательно, появляется на выходе lspci,

lspci показывает устройства, которые определены хост-контроллером, и в этом случае он может быть или не быть привязан к драйверу. Далее ядро ​​перебирает драйверы в системе, находит соответствующий и подключается к этому устройству.

Итак, причина, по которой вы видите устройство на выходе lspci Это потому, что хост-контроллер идентифицировал устройство и сообщил ядру PCI. Это не имеет значения, даже если какой-либо драйвер подключен к устройству или нет.

На большинстве компьютеров потребительского уровня распределение BAR выполняется в BIOS.

Я предполагаю, что в архитектуре с поддержкой горячего подключения это должно быть сделано или, по крайней мере, вызвано ОС.

Другие вопросы по тегам