Jak jądro Linux wiedzieć, które sterowniki załadować przy starcie systemu?
Kernel generuje zdarzenia dla urządzeń na przykład magistrali PCI, gdy są one podłączone (albo na gorąco, albo na zimno, zdarzenia są ustawiane w kolejce, dopóki przestrzeń użytkownika nie uruchomi AFAIR). udev odbierze te zdarzenia i wykona wywołania modprobe, które będą zawierać PID/VID (identyfikator produktu/dostawcy) urządzenia (ów); zazwyczaj jest to ciąg znaków z niektórymi * w nim. Modprobe obliczy przecięcie zbioru wyrażone przez wieloznacznik żądań obciążenia udev i zestaw aliasów modułów jądra (z których mogą to być symbole wieloznaczne).
Od USB/FireWire/etc. kontrolery są zwykle dołączane do magistrali PCI, w ten sposób ładowany jest sterownik HCI. Tak to się dzieje; ładowanie odbywa się oczywiście za pomocą USB/Firewire PID/VID.
Moduły protokołu sieciowego (np. Ipv6) nie są jednak obsługiwane przez udev; zamiast tego, gdy program wywołuje socket(AF_INET6, ...)
, jądro bezpośrednio wywołuje modprobe (dokładniej: cokolwiek jest w /proc/sys/kernel/modprobe
) z nie-wieloznacznym aliasem, net-pf-10
w przypadku IPv6, ponieważ AF_INET6
ma wartość 10. modprobe, a następnie ładuje ipv6.ko
, ponieważ jest to co ma alias net-pf-10
.
Podobnie dla systemów plików, próba mount -t foo
spowoduje, że jądro również wywoła modprobe (ponownie, poprzez ____call_usermodehelper
), tym razem z foo
jako argumentem.
Dostęp do węzłów urządzeń (np. /dev/loop0
, o ile już istnieje) ma taką samą strategię, jeśli loop.ko
nie jest jeszcze załadowany. Jądro tutaj wymaga block-major-7-0
(ponieważ loop0 zwykle ma (7,0), por. ls -l
), a loop.ko
ma pasujący alias block-major-7-*
.
Zgadywanie tego byłoby lepszym pytaniem dla http://unix.stackexchange.com. – ziesemer
http://doc.opensuse.org/documentation/html/openSUSE_113/opensuse-reference/cha.udev.html – firo