Moduł jądra to trochę skompilowanego kodu, który można wstawić do jądra w czasie wykonywania, na przykład za pomocą insmod
lub modprobe
.
Sterownik to trochę kodu, który działa w jądrze, aby komunikować się z jakimś urządzeniem sprzętowym. To „napędza” sprzęt. Większość każdego sprzętu w komputerze ma powiązany sterownik .¹ Duża część uruchomionego jądra to kod sterownika .²
Sterownik można wbudować statycznie w plik jądra na dysku .³ Sterownik można również wbudować jako moduł jądra, aby można go było później dynamicznie ładować. (A potem może rozładowany.)
Standardową praktyką jest budowanie sterowników jako modułów jądra tam, gdzie to możliwe, zamiast łączenia ich statycznie z jądrem, ponieważ daje to większą elastyczność. Istnieją jednak dobre powody, aby nie:
Czasami dany sterownik jest absolutnie niezbędny do uruchomienia systemu. To nie zdarza się tak często, jak można sobie wyobrazić, ze względu na funkcję initrd .
Sterowniki zbudowane statycznie mogą być dokładnie tym, czego potrzebujesz w systemie o statycznym zasięgu, takim jak system wbudowany . To znaczy, jeśli wiesz z góry, które sterowniki będą zawsze potrzebne i że to się nigdy nie zmieni, masz dobry powód, aby nie zawracać sobie głowy dynamicznymi modułami jądra.
Jeśli zbudujesz jądro statycznie i wyłączysz funkcję dynamicznego ładowania modułu Linuxa, zapobiegniesz modyfikacji kodu jądra w czasie wykonywania. Zapewnia to dodatkowe bezpieczeństwo i stabilność kosztem elastyczności.
Nie wszystkie moduły jądra są sterownikami. Na przykład stosunkowo nową funkcją jądra systemu Linux jest to, że można załadować inny program do planowania procesów . Innym przykładem jest to, że bardziej złożone typy sprzętu często mają wiele ogólnych warstw, które znajdują się między sterownikiem sprzętowym niskiego poziomu a obszarem użytkownika, takim jak sterownik USB HID , który implementuje określony element stosu USB , niezależnie od leżącego pod nim sprzętu.
Oprócz:
Jedynym wyjątkiem od tej szerokiej oświadczenia jest chip procesora, który ma „kierowca” per se . Twój komputer może również zawierać sprzęt, dla którego nie masz sterownika.
Reszta kodu w jądrze systemu operacyjnego zapewnia ogólne usługi, takie jak zarządzanie pamięcią , IPC , planowanie itp. Usługi te mogą przede wszystkim obsługiwać aplikacje dla obszarów użytkownika , tak jak w przypadku przykładów wcześniej połączonych, lub mogą być usługami wewnętrznymi używanymi przez sterowniki lub inne aplikacje wewnętrzne infrastruktura jądra.
Jeden w /boot
, ładowany do pamięci RAM w czasie uruchamiania przez moduł ładujący na początku procesu rozruchu .
man lspci
: „-k Pokaż sterowniki jądra obsługujące każde urządzenie, a także moduły jądra zdolne do obsługi ”. Można to przeczytać jako: „Pokaż sterownik aktualnie / faktycznie obsługujący urządzenie, a także wszystkie moduły, które mogłyby / powinny go obsługiwać ”.Aby odpowiedzieć na konkretne pytanie dotyczące
lspci
wyniku, wiersz „sterownik jądra” odnosi się do tego, który sterownik jest aktualnie związany z kartą, w tym przypadku jest to zastrzeżonynvidia
sterownik. W wierszu „modułów jądra” wymieniono wszystkie sterowniki, o których wiadomo, że mogą łączyć się z tą kartą. Tutaj zastrzeżony sterownik pokazuje inną nazwę, prawdopodobnie ze względu na sposóblspci
znalezienia sterownika i jego nazwy pliku w porównaniu z nazwą zakodowaną w samym sterowniku.źródło
man lspci
- mówi dokładnie to, co napisałeś.Zgodnie z tym ładnym samouczkiem :
Tak więc, jeśli spróbujemy narysować drzewo, będziemy mieli „sterownik urządzenia”, który dziedziczy (rozszerza) moduł i który ma bardziej specyficzne cechy, między którymi znajdujemy „dostęp do sprzętu” ...
źródło
Moduł jądra może w ogóle nie być sterownikiem urządzenia.
„Sterownik jądra” nie jest dobrze zdefiniowanym terminem, ale dajmy mu szansę.
Jest to moduł jądra, który nie napędza żadnego sprzętu, a zatem nie może być uznany za „sterownik urządzenia”:
Po kompilacji możesz go używać z:
i drukuje
hello init
dodmesg
.Istnieją jednak moduły jądra, które nie są sterownikami urządzeń, ale są faktycznie przydatne, np. Moduły, które ujawniają informacje o debugowaniu / wydajności jądra.
Sterowniki urządzeń są zwykle również modułami jądra.
Przykład czegoś, co jest „sterownikiem urządzenia”, jest nieco trudniejszy do wygenerowania, ponieważ wymaga sprzętu do napędu, a opisy sprzętu bywają skomplikowane.
Za pomocą QEMU lub innych emulatorów możemy jednak konstruować modele oprogramowania rzeczywistego lub uproszczonego sprzętu, co jest doskonałym sposobem na nauczenie się, jak rozmawiać ze sprzętem. Oto prosty przykład minimalnego sterownika urządzenia PCI: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Następnie widzimy, że w x86 rozmowa ze sprzętem sprowadza się do:
in
iout
instrukcje, np. https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273Zasadniczo tych operacji nie można wykonać z przestrzeni użytkownika, jak wyjaśniono na stronie: Jaka jest różnica między przestrzenią użytkownika a przestrzenią jądra? Istnieją jednak pewne wyjątki: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
Jądro następnie oferuje interfejsy API wyższego poziomu, aby taka interakcja sprzętowa była łatwiejsza i bardziej przenośna:
request_irq
do obsługi przerwańioreadX
i mapowanie pamięci IOźródło
Moja odpowiedź pójdzie z Jimem. Sterownik jądra to program (moduł jądra) przeznaczony do sterowania sprzętem. Wyjście lspci mówi, że nvidia jest sterownikiem jądra, ponieważ jest
loaded
modułem dla urządzenia. Wraz z nim dostępne są inne dostępne moduły jądra.Dodam, że polecenia w linux do listy i usunąć kierowcy
lsmod
irmmod
odpowiednio. Który mówi moduł listy i usuń moduł.źródło
Wszystkie sterowniki są modułami. Nie wszystkie moduły są sterownikami.
Moduły można wstawiać w czasie wykonywania. Moduły / sterowniki mogą być również kompilowane statycznie wraz z jądrem.
Typowy moduł init ma
Ten sam moduł może być sterownikiem
źródło