Ответ 1
Как ядро Linux знает, какие драйверы загружаются при загрузке?
Ядро генерирует события для устройств, например. шину PCI, когда они подключены (горячие или холодные, события помещаются в очередь, пока пользовательское пространство не запускает AFAIR). udev получит эти события и выполнит вызовы modprobe, которые включают идентификаторы PID/VID (идентификаторы продукта/поставщика) устройства (ов); это обычно строка с некоторым * в ней. modprobe затем вычислит пересечение множества, выраженное подстановочным словом uudev load, и набором псевдонимов модулей ядра (сами по себе являются подстановочными знаками).
Так как USB/Firewire/etc. контроллеры обычно подключаются к шине PCI, что загружается ваш драйвер HCI. Вот как все решает; загрузка затем выполняется с помощью USB/Firewire PID/VID, конечно.
Модули сетевого протокола (например, ipv6), однако, не рассматриваются через udev; вместо этого, когда программа вызывает socket(AF_INET6, ...)
, ядро напрямую вызывает modprobe (точнее: все, что находится в /proc/sys/kernel/modprobe
), с несимметричным псевдонимом net-pf-10
в случае IPv6, потому что AF_INET6
имеет значение 10. modprobe затем загружает ipv6.ko
, потому что это то, что имеет псевдоним net-pf-10
.
Аналогично для файловых систем попытка mount -t foo
приведет к тому, что ядро также вызовет modprobe (опять же, через ____call_usermodehelper
), на этот раз с foo
в качестве аргумента.
Доступ к узлам устройства (например, /dev/loop0
, если он уже существует) имеет ту же стратегию, если loop.ko
еще не загружен. Ядро здесь запрашивает block-major-7-0
(поскольку loop0 обычно имеет (7,0), cf. ls -l
), а loop.ko
имеет подгонку block-major-7-*
.