Как регистр базовых адресов получает адрес?
Я закончил разработку драйвера 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.
Я предполагаю, что в архитектуре с поддержкой горячего подключения это должно быть сделано или, по крайней мере, вызвано ОС.