Aggiunta del modulo al kernel

Aggiunta del modulo al kernel
Passeremo attraverso il processo o i passaggi necessari per aggiungere un modulo del kernel mentre il kernel è in esecuzione. Discuteremo anche delle poche utility utility disponibili. Queste utility possono essere impiegate per ottenere informazioni sul modulo già presenti nel kernel Linux, aggiungere un nuovo modulo e ottenere le informazioni sul modulo fornito.

Descrizione

Cominciamo con il modulo del kernel; Il modulo del kernel è la funzionalità separata logica che può essere aggiunta in una fase successiva nel kernel in esecuzione. Questo estende le funzionalità/funzioni del kernel Linux.

Questi moduli sono file con l'estensione come ".ko ”, che significa oggetti del kernel. Se incontriamo un file con ".ko ”come estensione, indica chiaramente che è un modulo del kernel.

Alcuni nomi di esempi di moduli sono: i2c-moduli.Ko, Hello-World.ko, ecc.

Il processo di aggiunta di un modulo del kernel al kernel è anche noto come caricamento di un modulo del kernel. Il modulo del kernel può essere caricato solo se è compatibile con l'albero di sorgente del kernel. Ciò significa che il modulo del kernel non è indipendente dalla piattaforma. Questi possono essere caricati solo sul kernel con lo stesso albero di origine e build configurazione.

Aggiunta/caricamento del modulo del kernel

Linux fornisce un'utilità nota come "insmod". Questa è l'utilità che può essere utilizzata per caricare il modulo del kernel sul kernel in esecuzione.

Per caricare il modulo del kernel, basta eseguire il comando come insmod seguito dal nome del file del modulo.

Facciamo un esempio di Hello-World.KO, un modulo che è il classico esempio e stampe solo il messaggio Hello World. Per caricare il modulo del kernel Hello-World, di seguito è il comando che può essere utilizzato:

Un'istantanea di esempio è collegata di seguito; Il file evidenziato è il modulo kernel:

$ sudo insmod hello-world.ko

Esempio Snapshot:

Con l'esecuzione riuscita del comando sopra, il nostro modulo viene aggiunto al kernel Linux e vedremo il messaggio di stampa dal modulo del kernel Hello-World nel buffer di stampa. Per controllare il messaggio dal Wel-World, usa il comando dmesg. Se il comando non risulta in nessun messaggio di errore, allora può essere considerato il successo del modulo. Mentre estendiamo le funzioni del kernel, quindi richiede privilegi super utente per eseguire il "insmod". L'output di esempio del comando dmesg è come di seguito:

Sushilrathore-2: ~/hello-world $ sudo insmod hello-world.ko
Sushilrathore-2: ~/Hello-World $ dmesg
[10500712.434672] Hello World
cienauser@haxv-sratore-2: ~/hello-world $

La conferma del modulo viene caricato

Per confermare se il modulo viene caricato e presente tra gli altri moduli nel kernel Linux. Il comando "LSMOD" può essere utilizzato per elencare tutti i moduli del kernel. Emetti il ​​comando nella shell di Linux e vedremo l'elenco completo dei moduli caricati nel kernel Linux. Emettendo LSMOD sul mio sistema, vedo l'output di seguito sulla console:

Sushilrathore-2: ~/Hello-World $ lsmod
Dimensione del modulo utilizzato da
Hello_World 16384 0
nf_conntrack_ipv6 20480 0
NF_DEFRAG_IPV6 20480 1 NF_CONNTRACK_IPV6
ip6table_filter 16384 0
ip6_tables 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

Come possiamo vedere nei registri sopra, ci sono molti moduli elencati e anche il nostro modulo Hello-World è nella lista; E l'ho messo in evidenza per un facile avvistamento.

Quindi abbiamo confermato che il nostro modulo è caricato con successo nel kernel.

Rimozione/scarico del modulo del kernel

Per rimuovere o scaricare il modulo del kernel, possiamo usare il comando Linux "rmod". Questo è il comando utilizzato per rimuovere il modulo del kernel caricato ed elencato da LSMOD. Questa operazione richiede anche privilegi superuser. Tornando al nostro esempio di Hello-World, se desideriamo rimuovere il modulo Kernel Hello-World che abbiamo caricato in precedenza. Dobbiamo emettere il comando seguente:

Sushilrathore-2: ~/hello-world $ sudo rmod hello_world
Sushilrathore-2: ~/Hello-World $

Dopo l'esecuzione del comando, se non viene visto nulla sulla console, io.e. Non esiste un messaggio di errore. Ciò significa che lo scarico/rimozione del modulo del kernel ha esito positivo.

Confermare la rimozione/scarico del modulo

Ancora una volta per confermare se il modulo è scaricato correttamente, possiamo usare il comando lsmod. Dopo la rimozione del modulo del kernel, non dovremmo vedere il modulo presente nell'elenco dei moduli forniti da "LSMOD".

Di seguito è riportato l'output di esempio dal mio sistema:

Sushilrathore-2: ~/Hello-World $ lsmod
Dimensione del modulo utilizzato da
nf_conntrack_ipv6 20480 0
NF_DEFRAG_IPV6 20480 1 NF_CONNTRACK_IPV6
ip6table_filter 16384 0
ip6_tables 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

Nell'elenco sopra, se controlliamo, non troveremo il modulo Kernel Hello-World. Questo doppio conferma che il modulo viene rimosso dal sistema.

C'è un'altra utilità molto importante offerta, che può essere utilizzata per ottenere le informazioni del file del modulo del kernel. "Modinfo" è il comando fornito per ottenere i dettagli del modulo kernel già presente.

Esecuzione del "modinfo" con il modulo del kernel Hello-World otteniamo l'output di seguito:

Sushilrathore-2: ~/Hello-World $ Modinfo Hello-World.ko
FileName:/Home/Sushilrathore/Hello-World/Hello-World.ko
Descrizione: Hello World!
Licenza: GPL
Srcversion: BBD5A60063B15C8D80048FD
dipende:
retpolina: y
Nome: Hello_World
Vermagic: 4.15.0-163-GENERIC SMP Mod_unload Modversioni
cienauser@haxv-sratore-2: ~/hello-world $

Le informazioni di cui sopra sono i dettagli del modulo del kernel. Le informazioni importanti da notare è che ti fornisce Srcversion e Vermagic. Queste informazioni possono essere utilizzate per identificare il kernel con cui questo modulo è compatibile e può essere caricato. Se proviamo ad aggiungere il modulo del kernel compilato per altre fonti Linux o kernel, otterremo l'errore incompatibile dal comando insmod.

Di seguito è riportato il codice di esempio e il codice Makefile che abbiamo usato nella nostra discussione sopra:

Ciao mondo.C

#includere
#includere
#includere
Module_license ("GPL");
Module_description ("Hello World!");
static int __inithello_init (void)

printk (Kern_info "Hello World \ n");
restituzione 0;

statico 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

Tutto:

make -c/lib/moduli/$ (shell uname -r)/build/m = $ (pwd) moduli

pulito:

fare -c/lib/moduli/$ (shell uname -r)/build m = $ (pwd) pulito

Conclusione

Finora abbiamo discusso del processo/passaggi dei moduli del kernel carichi per aggiungere il modulo del kernel. Insmod è il comando che abbiamo discusso per il caricamento del modulo del kernel. Per confermare se il modulo viene caricato correttamente, possiamo usare il comando LSMOD e infine, per rimuovere il comando rmod può essere utilizzato. C'è un altro modinfo di utilità che può essere utilizzato per stampare i dettagli del modulo del kernel.