Cosa sono i moduli del kernel?
I moduli del kernel sono parti di codice che possono essere caricate e scaricate dal kernel su richiesta.
I moduli del kernel offrono un modo semplice per estendere la funzionalità del kernel di base senza dover ricostruire o ricompilare nuovamente il kernel. La maggior parte dei driver sono implementati come moduli del kernel Linux. Quando quei driver non sono necessari, possiamo scaricare solo quel driver specifico, il che ridurrà le dimensioni dell'immagine del kernel.
I moduli del kernel avranno un'estensione .ko. Su un normale sistema Linux, i moduli del kernel risiederanno all'interno della directory /lib/modules/
In precedenza abbiamo discusso su come compilare un kernel dal sorgente.
Questo tutorial spiega come scrivere un modulo del kernel usando un semplice esempio di Hello World.
Io. Utilità per manipolare i moduli del kernel
1. lsmod – Elenca i moduli già caricati
Il comando lsmod elencherà i moduli che sono già caricati nel kernel come mostrato di seguito.
# lsmod Module Size Used by ppp_deflate 12806 0 zlib_deflate 26445 1 ppp_deflate bsd_comp 12785 0 ..
2. insmod – Inserisci il modulo nel kernel
Il comando insmod inserirà un nuovo modulo nel kernel come mostrato di seguito.
# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko # lsmod | grep "squash" squashfs 35834 0
3. modinfo – Visualizza le informazioni sul modulo
Il comando modinfo visualizzerà le informazioni su un modulo del kernel come mostrato di seguito.
# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko filename: /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko license: GPL author: Phillip Lougher description: squashfs 4.0, a compressed read-only filesystem srcversion: 89B46A0667BD5F2494C4C72 depends: intree: Y vermagic: 3.5.0-19-generic SMP mod_unload modversions 686
4. rmmod – Rimuovi il modulo dal kernel
Il comando rmmod rimuoverà un modulo dal kernel. Non puoi rimuovere un modulo che è già utilizzato da nessun programma.
# rmmod squashfs.ko
5. modprobe – Aggiungi o rimuovi moduli dal kernel
modprobe è un comando intelligente che caricherà/scaricherà i moduli in base alla dipendenza tra i moduli. Fare riferimento ai comandi di modprobe per esempi più dettagliati.
II. Scrivi un modulo del kernel Hello World semplice
1. Installazione delle intestazioni di Linux
Devi prima installare linux-headers-.. come mostrato di seguito. A seconda della tua distribuzione, usa apt-get o yum.
# apt-get install build-essential linux-headers-$(uname -r)
2. Codice sorgente del modulo Hello World
Quindi, crea il seguente modulo hello.c nel linguaggio di programmazione C.
#include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <linux/init.h> // included for __init and __exit macros MODULE_LICENSE("GPL"); MODULE_AUTHOR("Lakshmanan"); MODULE_DESCRIPTION("A Simple Hello World module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; // Non-zero return means that the module couldn't be loaded. } static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module.\n"); } module_init(hello_init); module_exit(hello_cleanup);
Avviso: Tutti i moduli del kernel funzioneranno sullo spazio del kernel, una modalità altamente privilegiata. Quindi fai attenzione a ciò che scrivi in un modulo del kernel.
3. Crea Makefile per compilare il modulo del kernel
Il seguente makefile può essere utilizzato per compilare il modulo del kernel di base di Hello World sopra.
obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Usa il comando make per compilare il modulo del kernel hello world come mostrato di seguito.
# make make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic' CC [M] /home/lakshmanan/a/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/lakshmanan/a/hello.mod.o LD [M] /home/lakshmanan/a/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'
Quanto sopra creerà il file hello.ko, che è il nostro modulo del kernel di esempio.
4. Inserisci o rimuovi il modulo del kernel di esempio
Ora che abbiamo il nostro file hello.ko, possiamo inserire questo modulo nel kernel usando il comando insmod come mostrato di seguito.
# insmod hello.ko # dmesg | tail -1 [ 8394.731865] Hello world! # rmmod hello.ko # dmesg | tail -1 [ 8707.989819] Cleaning up module.
Quando un modulo viene inserito nel kernel, verrà invocata la macro module_init, che chiamerà la funzione hello_init. Allo stesso modo, quando il modulo viene rimosso con rmmod, verrà invocata la macro module_exit, che chiamerà hello_exit. Usando il comando dmesg, possiamo vedere l'output dal modulo del kernel di esempio.
Si noti che printk è una funzione definita nel kernel e si comporta in modo simile a printf nella libreria IO. Ricorda che non puoi usare nessuna delle funzioni della libreria dal modulo del kernel.
Ora hai imparato le basi per creare il tuo modulo del kernel Linux.