7.2.1 Caricamento di moduli in memoria

Un LKM può definire degli elementi, una sorta di variabili di ambiente particolari, detti symbol (simboli). Altri LKM possono far uso di symbol definiti da un LKM. In questo modo si viene ad instaurare una dipendenza tra LKM, poiché alcuni, per il loro funzionamento, hanno bisogno di symbol definiti da altri.

Per poter caricare un LKM in memoria è quindi opportuno che vengano rispettate le eventuali dipendenze previste: può darsi che un modulo M1 per poter essere caricato in memoria, richieda che prima di esso sia stato caricato il modulo M0 (perché fa uso di symbol definiti da quest’ultimo) così, per poter caricare M1 è necessario prima caricare M0 e successivamente quindi M1. In modo analogo, ma in ordine inverso a quello di caricamento, i moduli potranno essere scaricati dalla memoria.

In genere le dipendenze tra i LKM sono memorizzate nel file /lib/modules/kernel_version/modules.dep con la seguente sintassi

 
module_filename: [dep_module_filename_1 [dep_module_filename_2 ...]]  
dove dep_module_filename_i sono gli eventuali LKM dai quali dipende module_filename.

Tale file viene generato per mezzo del comando depmod (man page depmod(8)), che controlla i LKM presenti nel sottoalbero di directory /lib/modules/kernel_version determinando per ognuno di essi i symbol esportati ed i simboli di cui ha bisogno, creando così l’elenco delle dipendenze.

____________________________________________________________________

Comando: depmod
Path: /sbin/depmod

SINTASSI  
# depmod [option]  
DESCRIZIONE

____________________________________________________________________

[da completare ...]

I LKM possono essere caricati in memoria con il comando insmod (man page insmod(8)).

__________________________________________________________________________________________________________

Comando: insmod
Path: /sbin/insmod

SINTASSI  
# insmod modulename [module_parms]  
DESCRIZIONE

____________________________________________________________________________________________________________________

Ad esempio, per caricare in memoria il modulo serial.ko (il driver della porta seriale), si può impartire il comando

 
# insmod serial.ko  
Non è detto che sia sempre così semplice, poiché alcuni LKM possono richiedere dei parametri, che possono variare moltissimo da un LKM all’altro. Ogni LKM fa storia a sé.

Quando un LKM viene caricato in memoria, esso diviene parte integrante del kernel in esecuzione. Spesso, un LKM è un device driver e quando esso viene caricato in memoria, ricerca un dispositivo del tipo che sa gestire, quindi, in caso positivo, si registra come il driver con un determinato major number e come gestore dell’interrupt utilizzato dal dispositivo. In questo modo si può gestire il dispositivo per mezzo di un file di dispositivo che fa riferimento al major number relativo al diver in questione.

L’elenco dei dispositivi associati ai major number è contenuto nel file /proc/devices ed un esempio è riportato di seguito

Character devices:
1 mem
2 pty
3 ttyp
4 ttyS
5 cua
6 lp
7 vcs
10 misc
13 input
14 sound
29 fb
36 netlink
128 ptm
129 ptm
130 ptm
131 ptm
132 ptm
133 ptm
134 ptm
135 ptm
136 pts
137 pts
138 pts
139 pts
140 pts
141 pts
142 pts
143 pts
162 raw
180 usb
254 pcmcia
Block devices:
1 ramdisk
2 fd
3 ide0
9 md
12 unnamed
14 unnamed
22 ide1
38 unnamed
39 unnamed
L’elenco degli interrupt associati ai dispositivi è contenuto nel file /proc/interrupts ed un esempio è riportato di seguito

                                                                        
                                                                        
       CPU0
0:     346058          XT-PIC  timer
1:      14930          XT-PIC  keyboard
2:          0          XT-PIC  cascade
3:          5          XT-PIC  pcnet_cs
8:          1          XT-PIC  rtc
10:         35          XT-PIC  ALi Audio Accelerator
11:         36          XT-PIC  usb-ohci, O2 Micro, Inc. OZ6812 Cardbus Controller
12:      21575          XT-PIC  PS/2 Mouse
14:      13829          XT-PIC  ide0
15:      24121          XT-PIC  ide1
NMI:          0
ERR:          0
Nel caso in cui il LKM caricato sia un network driver, esso si registra come gestore del relativo dispositivo di rete, riferendosi al suo nome. L’elenco dei nomi delle interfacce di rete correntemente registrate è contenuto nel file /proc/net/dev ed un esempio è riportato di seguito

Inter-|   Receive                                                |  Transmit
face |bytes    packets errs drop fifo frame compressed multicast|bytes    packe
 lo: 1889232   27641    0    0    0     0          0         0  1889232   276
eth0:       0       0    0    0    0     0          0         0      240
Un LKM che viene caricato in memoria, generalmente, aggiorna il system log17 con messaggi che tracciano il suo avvenuto caricamento.

Il caricamento di LKM in memoria può anche non andare a buon fine e insmod lo segnala essenzialmente con i seguenti messaggi di errore

[da completare ...]

Come già evidenziato in precedenza, un LKM può avere delle dipendenze da rispettare per poter essere caricato in memoria. L’elenco delle dipendenze di un LKM può essere visaulizzato dal comando modinfo (man page modinfo(8)).

[da completare ...]

7.2.1.1 Caricamento intelligente

Piuttosto che caricare i moduli manualmente con insmod, stando attenti a rispettare le dipendenze, è di gran lunga consigliato utilizzare un meccanismo di caricamento intelligente, mediante il comando modprobe (man page modprobe(8)) che verifica le dipendenze del modulo da caricare dal file /lib/modules/kernel_version/modules.dep ed in caso ce ne sia bisogno carica anche i moduli da cui esso dipende. Inoltre modprobe permette di specificare come argomento un nome simbolico del LKM da caricare in memoria piuttosto che il nome del file che lo contiene, risolvendo automaticamente il caricamento del file corretto. Ad esempio, il comando

 
# modprobe msdos  
può caricare in memoria il LKM rappresentato dal file /lib/2.6.2-2/fs/msdos.ko. Per far ciò modprobe utilizza il contenuto del file /etc/modprobe.conf18 che contiene la relazione tra il nome simbolico ed il nome fisico del file relativo ad ogni LKM.

[da completare ...]

____________________________________________________________________

Comando: modprobe
Path: /sbin/modprobe

SINTASSI  
# modprobe [option] [modulename] [module_parms]  
DESCRIZIONE

Per il passaggio di parametri a modprobe si può utilizzare anche la variabile di ambiente MODPROBE_OPTIONS. ________________________________________________________________________

[da completare ...]

Il file di configurazione di default di modprobe è /etc/modprobe.conf. Esso contiene non solo le informazioni necessarie a risolvere la relazione tra il nome simbolico e quello effettivo del file per ogni LKM, ma anche le opzioni relative ai vari LKM.

Ogni riga del file di configurazione di modprobe contiene una direttiva. Se l’ultimo carattere della riga è \, indica che tale riga continua su quella successiva. La sintassi è una semplificazione di quella del file /etc/modules.conf utilizzato con le versioni di Linux precedenti alla 2.6 ed è descritta di seguito

[da completare ...]