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
-
option indica la modalità di funzionamento di depmod. Può assumere i seguenti
valori:
-
-b basedir | --basedir basedir
specifica di considerare i LKM presenti nella directory basedir
piuttosto che in quella standard (/lib/modules/kernel_version);
-
-e | --errsyms
se utilizzato con l’opzione -F riporta gli eventuali symbol utilizzati
dai LKM ma non definiti da nessuno;
-
-F system.map | --filesyms system.map
specifica il file system.map generato dalla compilazione del kernel;
-
-n | --dry-run
inica di visualizzare il risultato del controllo senza aggiornare il file
modules.dep;
-
-A | --quick
indica di effettuare il controllo soltanto su eventuali nuovi file;
____________________________________________________________________
[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
-
option indica la modalità di funzionamento di insmod. Può assumere i seguenti
valori:
-
-
-e persist_name | --persist=persist_name
specifica se i dati persistenti del modulo devono essere acquisiti al
suo caricamento e memorizzati quando il modulo viene scaricato
dalla memoria. L’opzione -e "" è interpretata come il valore
di persistdir indicato nel file di configurazione (per default
/etc/modules.conf) seguito dal nome del modulo specificato da
modulename;
-
-f | --force
tenta di caricare in memoria il modulo modulename anche se la
versione del kernel per la quale è stato compilato non coincide
con quella del kernel corernte (tale opzione ha effetto soltanto sul
controllo della versione del kernel, non sui nomi dei simboli);
-
modulename indica il nome del file che rappresenta il LKM da caricare in
memoria;
-
module_parms sono eventuali parametri, specifici per ogni LKM, che possono
essere specificati sulla riga di comando del caricamento del modulo in
questione.
____________________________________________________________________________________________________________________
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
log
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
-
unresolved symbol symbol_name
questo messaggio segnala che il tentativo di caricare il LKM in memoria non è
andato a buon fine poiché esso contiene dei riferimenti al simbolo symbol_name
che non è correntemente definito dal kernel di base o da altri LKM già caricati
in memoria. Il kernel ed i LKM possono infatti definire dei simboli (symbol) ai
quali possono far riferimento altri LKM. In questo modo si vengono a definire
delle dipendenze tra LKM: è possibile che un LKM necessiti della presenza di
altri LKM per poter essere caricato in memoria. Quindi è importante l’ordine
cronologico di caricamento dei LKM in memoria;
-
couldn't find the kernel version this module was compiled for
questo messaggio segnala che il tentativo di caricare il LKM in memoria non è
andato a buon fine poiché il file indicato contiene riferimenti ad una versione di
kernel che non coincide con quella in esecuzione (oppure il file indicato non è
affatto un LKM);
[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.conf
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
-
option indica la modalità di funzionamento di modprobe. Può assumere i seguenti
valori:
-
-v | --verbose
indica di visualizzare più messaggi durante l’operazione (per default
vengono visualizzati dei messaggi soltanto in caso di errore);
-
-C filename | --config=filename
specifica il file di configurazione da utilizzare (per default viene
utilizzato il file /etc/modprobe.conf);
-
-c | --showconfig
indica di visualizzare il contenuto del file di configurazione;
-
-n | --dry-run
indica di effettuare tutte le operazioni indicate tranne l’effettivo
caricamento/scarico dei LKM (in combinazione con -v è utile per il
debug);
-
-i | --ignore-install | --ignore-remove
indica di ignorare eventuali comandi di caricamento/scarico realtivi
al LKM specificato, indicati nel file di configurazione;
-
-q | --quiet
indica di non visualizzare nessun messaggio in caso di errore;
-
-r | --remove
indica di scaricare dalla memoria i LKM indicati da modulename
(se non più utilizzati, vengono rimossi anche i moduli dai quali esso
dipende). Generalmente non c’è bisogno di scaricare manualmente i
LKM dalla memoria (il kernel potrebbe non permetterlo);
-
-V | --version
visualizza la versione di modprobe;
-
-f | --force
indica di non considerare la versione del kernel di riferimento
contenuta all’interno dei LKM (sia da quello specificato da
modulename che dagli eventuali LKM dai quali esso dipende).
Analogo all’utilizzo di entrambe le opzioni --force-vermagic e
--force-modversion;
-
--force-vermagic
indica di non considerare la versione del kernel di riferimento
contenuta all’interno dei LKM. Utile nel caso in cui si verifichi un
errore che riguarda il version magic;
-
--force-modversion
indica di non considerare la versione dell’interfaccia fornita dal LKM;
-
-l | --list
indica di elencare i LKM che soddisfano il nome specificato da
modulename (le wildcard sono ammesse);
-
-a | --all
indica di caricare tutti i LKM che soddisfano il nome specificato da
modulename (le wildcard sono ammesse);
-
-t dirname | --type=dirname
indica di restringere l’elenco dei LKM ottenuto con le opzioni -l o
-a alle directory il cui nome soddisfa il pattern indicato da dirname;
-
-s | --syslog
indica di scrivere gli eventuali errori nel system log;
-
--set-version=ver
indica di considerare la versione del kernel indicata da ver piuttosto
che ricavarla automaticamente dal sistema con uname.;
-
--show-depends
indica di visualizzare l’elenco delle dipendenze del LKM, senza
effettuare nessun eventuale caricamento in memoria;
-
-o modname | --name=modname
indica di rinominare un LKM già caricato in memoria con il nome
indicato da modname. Ciò può essere utile in fase di test poiché
potrebbe essere agevole caricare più volte in memoria lo stesso LKM,
ma il kernel non permette di avere due LKM caricati con lo stesso
nome;
-
--first-time
indica di ritornare un errore nel caso in cui si tenti di caricare in
memoria un LKM già presente o scaricare dalla memoria un LKM
non presente (per default modprobe non ritorna errore in questi casi);
-
modulename specifica il nome simbolico del LKM da caricare/scaricare dalla memoria o
un pattern per le opzioni -l o -a. Nel caso di scaricamento, possono essere
specificati più di un LKM separati da uno spazio;
-
module_parms specifica gli eventuali parametri da passare al LKM al momento del
caricamento in memoria;
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
-
alias symname modulename
assegna l’alias symname (nome simbolico) ad un nome di file di un LKM
(modulename). l’alias (symname) può contenere anche wildcard che permettono
a qualunque stringa che soddisfa symname di far riferimento a modulename.
Non è possible definire un alias di un alias. Una ridefinizione di un alias già
precedentemente definito ne causa la sua sovrascrittura;
-
options name option [...]
specifica le opzioni per un LKM specificato dal suo nome effettivo o da un alias
(name). I parametri effettivamente passati al LKM sono l’unione di quelli presenti
nelle varie direttive che si riferiscono allo stesso LKM e da quelli passati sulla
riga di comando;
-
install name command
specifica di eseguire il comando command invece di caricare il LKM name in
memoria (command può contenere anche più di un comando separati tra loro dal
carattere ‘;’);
-
remove name command
specifica di eseguire il comando command invece di scaricare il LKM name dalla
memoria (command può contenere anche più di un comando separati tra loro dal
carattere ‘;’);
-
include filename
indica di includere il contenuto del file filename;
[da completare ...]