Как ядро ​​Linux обнаруживает устройства PCI? - PullRequest
0 голосов
/ 16 января 2020

На стороне драйвера, pci_register_driver() вызывается, когда загружается модуль драйвера, или во время загрузки, если модуль встроен. (Всякий раз, когда добавляется устройство / драйвер, список драйверов / устройств зацикливается, чтобы найти соответствие, я получаю эту часть.)

Но где / когда устройства pci обнаруживаются и регистрируются на шине? Я предполагаю, что это спецификация arch c, и она будет включать B IOS на x86, например - B IOS рутинные зондовые устройства PCI, а затем помещать результаты в некоторый список в ОЗУ, перед загрузкой ядра, и каждая запись списка содержит информацию об одном устройстве pci, включая vendorId / deviceId et c. Затем ядро ​​берет список и вставляет их в pci_bus_type.p.klist_devices в какой-то момент. Но это чистое предположение, кто-нибудь может дать некоторые подсказки?

1 Ответ

4 голосов
/ 16 января 2020

На самом деле, B IOS не требуется.

PCI стандартизирует определенную процедуру обнаружения устройств на шине. Эта процедура может быть запущена в любое время (не только при загрузке) контроллером горячего подключения или даже вручную, через /sys/bus/pci/rescan (см. pci_rescan_bus ).

Сканирование будет выполняться рекурсивно, проходя обнаружение мостов и считывание данных пространства конфигурации с каждого обнаруженного устройства (см. пространство конфигурации PCI ).

Для каждого найденного устройства, если оно еще не активно, ядро ​​будет искать экземпляр pci_driver объект с совпадающим pci_device_id. Затем он вызовет метод probe этого объекта (остальное - спецификация реализации драйвера c).

Если соответствующий экземпляр pci_driver не найден, ядро ​​отправит событие демону пользовательского пространства (udev или hotpug или что-то еще), который может загрузить соответствующий модуль и создать необходимый объект pci_driver.

...