Dodawanie modułu do jądra

Dodawanie modułu do jądra
Przejdziemy proces lub kroki wymagane do dodania modułu jądra podczas uruchomienia jądra. Omówimy również kilka dostępnych użytecznych narzędzi Linux. Narzędzia te można zastosować, aby uzyskać informacje o module już obecnym w jądrze Linux, dodać nowy moduł i uzyskać informacje o dostarczonym module.

Opis

Zacznijmy od modułu jądra; Moduł jądra jest logiczną osobną funkcjonalnością, którą można dodać na późniejszym etapie bieżącego jądra. To rozszerza funkcje/funkcje jądra Linux.

Te moduły to pliki z rozszerzeniem jako „.ko ”, co oznacza obiekty jądra. Jeśli natkniemy się na jakikolwiek plik z „.Ko ”Jako rozszerzenie wyraźnie wskazuje, że jest to moduł jądra.

Kilka przykładowych nazw modułów to: i2c-moduły.Ko, Hello-World.Ko itp.

Proces dodawania modułu jądra do jądra jest również znany jako ładowanie modułu jądra. Moduł jądra można załadować tylko wtedy, gdy jest kompatybilny z drzewem źródłowym jądra. Oznacza to, że moduł jądra nie jest niezależny od platformy. Można je załadować tylko na jądrze za pomocą tego samego drzewa źródłowego i konfiguracji kompilacji.

Dodanie/ładowanie modułu jądra

Linux zapewnia narzędzie znane jako „Insmod”. Jest to narzędzie, które można użyć do ładowania modułu jądra w bieżącym jądrze.

Aby załadować moduł jądra, po prostu wykonaj polecenie jako insmod, a następnie nazwa pliku modułu.

Weźmy przykład Hello-World.KO, moduł, który jest klasycznym przykładem i po prostu drukuje wiadomość Hello World. Aby załadować moduł jądra Hello-World, poniżej znajduje się polecenie, które można użyć:

Poniżej znajduje się przykładowa migawka; Podświetlony plik to moduł jądra:

$ sudo insmod hello-world.Ko

Przykładowa migawka:

Wraz z pomyślnym wykonaniem powyższego polecenia nasz moduł jest dodawany do jądra Linux i zobaczymy wiadomość drukowania z modułu jądra Hello-World w buforze PrintK. Aby sprawdzić wiadomość z Hello-World, użyj polecenia DMESG. Jeśli polecenie nie powoduje żadnego komunikatu o błędzie, można go uznać za dodanie modułu. W miarę rozszerzania funkcji jądra wymaga super uprawnień użytkownika do wykonania „insmod”. Przykładowe dane wyjściowe polecenia DMESG jest jak poniżej:

sushilrathore-2: ~/hello-world $ sudo insmod hello-world.Ko
sushilrathore-2: ~/hello-world $ dmesg
[10500712.434672] Hello World
cinauser@haxv-sathore-2: ~/hello-world $

Potwierdzanie modułu jest ładowane

Aby potwierdzić, czy moduł jest załadowany i obecny wśród innych modułów w jądrze Linux. Polecenie „LSMOD” można użyć do wymienienia wszystkich modułów jądra. Wydawaj polecenie w linii Linux, a zobaczymy pełną listę załadowanych modułów w jądrze Linux. Wydając LSMOD na moim systemie, widzę poniższe wyjście w konsoli:

sushilrathore-2: ~/hello-world $ lsmod
Rozmiar modułu używany przez
Hello_World 16384 0
NF_CONNTRACK_IPV6 20480 0
NF_DEFrag_IPV6 20480 1 NF_CONNTRACK_IPV6
IP6Table_filter 16384 0
IP6_TABALES 28672 1 IP6TABLE_FILTER
NF_CONNTRACK_IPV4 16384 0
NF_DEFrag_IPV4 16384 1 NF_CONNTRACK_IPV4
XT_RECENT 20480 0
XT_CONNTRACK 16384 0
NF_CONNTRACK 135168 3 XT_CONNTRACK, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
CPUID 16384 0
iptable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf

Jak widać w powyższych dziennikach, na liście znajduje się wiele modułów, a nasz moduł Hello-World jest również na liście; i podkreśliłem to dla łatwej plamki.

Potwierdziliśmy więc, że nasz moduł jest z powodzeniem załadowany do jądra.

Usuwanie/rozładunek modułu jądra

Aby usunąć lub rozładować moduł jądra, możemy użyć polecenia Linux „RMMOD”. Jest to polecenie używane do usunięcia modułu załadowanego jądra i wymienionego przez LSMOD. Ta operacja wymaga również uprawnień Superuser. Wracając do naszego przykładu Hello-World, jeśli chcemy usunąć moduł jądra Hello-World, który załadowaliśmy wcześniej. Musimy wydać poniższe polecenie:

sushilrathore-2: ~/hello-world $ sudo rmmod hello_world
sushilrathore-2: ~/hello-world $

Po wykonaniu polecenia, jeśli nic nie widać na konsoli, ja.mi. Nie ma komunikatu o błędzie. Oznacza to, że rozładunek/usuwanie modułu jądra zakończy się powodzeniem.

Potwierdzenie usuwania/rozładunku modułu

Ponownie, aby potwierdzić, czy moduł jest pomyślnie rozładowany, możemy użyć polecenia LSMOD. Po usunięciu modułu jądra nie powinniśmy widzieć modułu obecnego na liście modułów dostarczonych przez „LSMOD”.

Poniżej znajduje się przykładowe dane wyjściowe z mojego systemu:

sushilrathore-2: ~/hello-world $ lsmod
Rozmiar modułu używany przez
NF_CONNTRACK_IPV6 20480 0
NF_DEFrag_IPV6 20480 1 NF_CONNTRACK_IPV6
IP6Table_filter 16384 0
IP6_TABALES 28672 1 IP6TABLE_FILTER
NF_CONNTRACK_IPV4 16384 0
NF_DEFrag_IPV4 16384 1 NF_CONNTRACK_IPV4
XT_RECENT 20480 0
XT_CONNTRACK 16384 0
NF_CONNTRACK 135168 3 XT_CONNTRACK, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
CPUID 16384 0
iptable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf
vmw_vsock_vmci_transport 32768 1
vsock 36864 2 vmw_vsock_vmci_transport
binfmt_misc 20480 1
intel_rapl_perf 16384 0
Joydev 24576 0
Input_LEDS 16384 0
VMW_BALLOON 20480 0
Serio_RAW 16384 0
SHPCHP 36864 0
VMW_VMCI 69632 2 VMW_BALLOON, VMW_VSOCK_VMCI_TRANSPORT

Na powyższej liście, jeśli to sprawdzimy, nie znajdziemy modułu jądra Hello-World. To podwójne potwierdzają, że moduł jest usuwany z systemu.

Jest jeszcze jedno bardzo ważne narzędzie, które można wykorzystać do uzyskania informacji o pliku modułu jądra. „Modinfo” to polecenie podane w celu uzyskania szczegółów już obecnego modułu jądra.

Wykonanie „modinfo” z modułem jądra Hello-World otrzymujemy poniższe wyjście:

sushilrathore-2: ~/hello-world $ modinfo hello-world.Ko
Filename:/home/sushilrathore/hello-world/hello-world.Ko
Opis: Hello World!
Licencja: GPL
Srcversion: BBD5A60063B15C8D80048FD
zależy:
Retpoline: y
Nazwa: hello_world
Vermagic: 4.15.0-163-generyczny SMP mod_unload MODVERSIONS
cinauser@haxv-sathore-2: ~/hello-world $

Powyższe informacje to szczegóły modułu jądra. Ważną informacją jest to, że zapewnia srcversion i vermagic. Informacje te można wykorzystać do zidentyfikowania jądra, z którym ten moduł jest kompatybilny i może być załadowany. Jeśli spróbujemy dodać moduł jądra opracowany dla innych źródeł Linux lub jądra, otrzymamy niezgodny błąd z polecenia Insmod.

Poniżej znajduje się przykładowy kod i kod makefile, którego użyliśmy w naszej dyskusji powyżej:

Witaj świecie.C

#włączać
#włączać
#włączać
Module_license („gpl”);
Module_description („Witaj świat!");
Statyczny int __inithello_init (void)

printk (kern_info "hello świat \ n");
powrót 0;

statyczna void __exit hello_exit (void)

printk (kern_info „Goodbye World \ n”);

module_init (hello_init);
module_exit (hello_exit);

Makefile

OBJ-M = Hello-World.o

Wszystko:

Make -c/lib/modules/$ (shell uname -r)/build/m = $ (pwd) moduły

czysty:

Make -c/lib/modules/$ (shell uname -r)/build m = $ (PWD) Clean

Wniosek

Do tej pory omówiliśmy o przetwarzaniu/krokach modułów jądra, aby dodać moduł jądra. Insmod to polecenie, które omówiliśmy w celu załadowania modułu jądra. Aby potwierdzić, czy moduł jest pomyślnie załadowany, możemy użyć polecenia LSMOD, a na koniec, aby usunąć polecenie RMMOD. Jest jeszcze jeden Modinfo, którego można użyć do wydrukowania szczegółów modułu jądra.