2014-06-05 9 views
3

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

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

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

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

ответ

0

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

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

1

Распределение адресов для устройств 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. Это не имеет значения, даже если какой-либо драйвер подключен к устройству или нет.