Programmare Moduli di Kernel Linux

Il kernel di Linux è un core centrale a cui è possibile agganciare dei moduli, che non sono altro che delle parti che non sono importanti per il boot, ma che risultano essenziali per fare uso di determinati servizi. Poniamo l’esempio di una chiavetta USB formattata con il filesystem FAT32 di Windows, in questo caso caricare il codice per leggere e scrivere su questo filesystem non è importante all’accensione della macchina, ma se vogliamo utilizzarla quando ne abbiamo bisogno, allora dobbiamo avere un modulo fat.ko che venga caricato automaticamente al momento in cui viene fatto il mounting del dispositivo e magari scaricarlo al momento dell’unmounting. Tutto questo processo ha un solo ed unico scopo, poter caricare in memoria all’accensione solo lo stretto necessario al funzionamento del sistema operativo, capacità che fa di Linux un sistema molto plasmabile rispetto all’hardware anche vetusto su cui installarlo.
Gli strumenti per amministrare i moduli del kernel Linux risiedono nel pacchetto modutils e tra questi abbiamo:

  • lsmod – visualizza l’elenco dei moduli caricati dal kernel.
  • depmod – serve per stabilire le dipendenze tra i vari moduli presenti nel sistema.
  • insmod – installa un modulo nel kernel.
  • rmmod – rimuove un modulo installato in precedenza.
  • modprobe – serve per installare un modulo, ma viene pilotato dal file /etc/modules.conf.
  • dmesg – stampa tutti i messaggi del kernel in un buffer. I moduli attraverso la funzione printk, l’omologo di printf per i moduli di kernel, utilizzano stdout e stderr per inviare l’output al system log.

Vediamo allora come creare un semplicissimo modulo di kernel che stampi delle stringhe nel system log:

/* File hello.c */
#include <linux/kernel.h>
#include <linux/module.h>

int init_module()
{
   printk(KERN_INFO "Caricamento del modulo hello...\n");
   printk(KERN_INFO "Benvenuti nel mondo dei moduli di kernel!\n");
   return 0;
}

void cleanup_module()
{
   printk(KERN_INFO "Scaricamento del modulo hello...\n");
   return;
}

Come potete notare scrivere un modulo di kernel per Linux è davvero semplice, abbiamo una funzione che viene chiamata al caricamento ed una allo scaricamento del modulo dal kernel, qui non facciamo altro che stampare una stringa sul system log. Per compilare il nostro modulo occorre creare un Makefile di questo tipo:

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

Prima di tutto consiglio di lavorare su una macchina virtuale di test e mai su macchine di produzione, poi inserite i due file dentro una directory nella vostra cartella home e poi date il comando make. Come potete notare la compilazione ha creato vari file, il modulo per il kernel, dalla versione 2.6 in poi, è hello.ko e sarà questo che inseriremo nel kernel. Date il comando insmod hello.ko, poi rmmod hello.ko ed infine controllate i messaggi del kernel con il comando dmesg|tail. Se tutto ha funzionato potete vedere in fondo alla lista dei messaggi anche quelli del nostro modulo di kernel Linux.
Se alcuni di voi sono interessati a proseguire l’argomento, potremmo anche spiegare in un prossimo futuro come creare dei semplici, ma veri, device driver per la nostra distribuzione Linux.

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in Linux e contrassegnata con , . Contrassegna il permalink.