7.2 LKM - I moduli del kernel

Il kernel di GNU/Linux è generalmente composto da un file vmlinuz o simile, e, come accennato nella sez. 7.1.1, le funzionalità non di base possono essere “modularizzate”, ovvero il relativo codice può essere inserito in file diversi dal kernel stesso, detti LKM (Loadable Kernel Module) o moduli.14

Un LKM è un file in formato binario ELF (Executable and Linkable Format) che ha generalmente estensione ‘.ko’ o ‘.o’ ed è memorizzato nel sottoalbero della directory /lib/modules/kernel_version (dove kernel_version indica appunto la versione del kernel per la quale il modulo è stato realizzato)15 ed è possibile caricarlo in memoria quando si presenta la necessità di utilizzare le sue funzionalità.

L’estensione .o è utilizzata per i file oggetto (object file), che sono il prodotto della fase di compilazione e servono per la fase di linking (v. cap. 15). A partire dalla versione 2.6 del kernel Linux i LKM hanno estensione .ko (kernel object file) in modo da poterli distinguere più agevolmente dagli altri file oggetto, che rimangono con estensione .o.

L’operazione di caricamento di un LKM in memoria, consiste appunto nel caricamento in memoria centrale (in kernel-space) del codice contenuto nel file relativo al modulo desiderato. I LKM, quindi, costituiscono a tutti gli effetti una parte integrante del kernel di GNU/Linux: sono delle vere e proprie estensioni del kernel di base (intendendo per kernel di base quello composto dal codice contenuto nel file vmlinuz, o simile) e come tali possono estenderne funzionalità ma anche rimpiazzarle, modificandone il comportamento.

È consigliabile l’utilizzo dei LKM rispetto a modificare direttamente il codice del kernel, in quanto presenta i seguenti vantaggi

In genere la tecnica dei LKM è utilizzata per realizzare software che appartiene alle seguenti categorie I LKM distribuiti assieme al kernel standard vengono generati con il comando

 
# make modules  
come illustrato nella sez. 7.1.2, che produce un insieme di file *.ko o *.o (i LKM). Il comando

 
# make modules_install  
copia i file binari ottenuti al passo precedente (i LKM), nell’opportuna directory all’interno di /lib/modules/kernel_version.

Altri LKM, non distribuiti con il kernel di GNU/Linux, possono avere una propria procedura di creazione.

Alcuni LKM possono utilizzare dati che risentono della “storia” da un caricamento all’altro del LKM considerato. Tali informazioni, dette dati persistenti (persistent data), vengono salvate su un file quando lo specifico LKM viene scaricato dalla memoria e rilette dal file stesso quando il LKM viene nuovamente caricato in memoria.

I moduli sono gestiti per mezzo dei comandi che fanno parte del pacchetto module-init-tools16 descritti di seguito.

[da completare ...]


  7.2.1 Caricamento di moduli in memoria
   7.2.1.1 Caricamento intelligente
  7.2.2 Scarico di moduli dalla memoria
  7.2.3 Caricamento automatico dei moduli
   7.2.3.1 Il kernel module loader
   7.2.3.2 il daemon kerneld
  7.2.4 Scaricamento automatico dei moduli
  7.2.5 Elenco dei moduli caricati in memoria