[Kernel] Comprendere il funzionamento dei moduli
Questo piccolo howto e’ rivolto a tutti coloro che vogliono capire, nel dettaglio, come funziona e come si comporta il kernel nel momento in cui andiamo ad aggiungere del codice esterno (moduli). Il kernel infatti, per natura, esegue sia il codice contenuto al proprio interno (routine), sia quello aggiunto da noi successivamente (sub-routine) senza problemi di sorta..ed e’ proprio questa la particolarita’ che lo contraddistingue (kernel monolitico interposto tra hardware e software):

Comprendere questo meccanismo, si puo’ rivelare utile anche nel caso volessimo aggiungere dei moduli esterni al kernel tree ed ottenere quindi, dietro modifica del Makefile, una immagine pacchettizzata con i nostri drivers preferiti.
Per iniziare dobbiamo procurarci gli sorgenti del kernel o, in alternativa, la versione preferita (non necessariamente l’ultima disponibile).
NB: Non e’ assolutamente necessario possedere i sorgenti del kernel, perche’ l’esempio si puo’ benissimo applicare disponendo solamente dei kernel-headers..
Scompattiamo i sorgenti in /usr/src:
sudo cp -v linux-2.6.23.11.tar.bz2 /usr/src
sudo tar xjvf linux-2.6.23.11.tar.bz2
Spostiamoci in:
cd /usr/src/linux-2.6.23.11/drivers
..e aggiungiamo la nostra directory di prova con:
sudo mkdir hello
A questo punto dobbiamo creare:
1- File di testo con estensione .c (scritto quindi in C..linguaggio di programmazione della maggior parte dei moduli)
2- Makefile
Sempre all’interno della stessa directory lanciamo:
sudo kate hello-2.c
Questo file di testo conterra’ il seguente codice (seguire il link):
- Pastebin

Passiamo al Makefile:
sudo kate Makefile
Inseriamo le istruzioni per compilare il nostro file:
obj-m += hello-2.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
NB: assicurarsi che all’ interno di /lib/modules/$(shell uname -r)/ sia presente la directory build.
Ora possiamo compilare il nostro modulo col semplice comando di “make” ( a seconda dei permessi con o senza sudo):
dyve@a6j:/usr/src/linux-2.6.23.11/drivers/hello$ sudo make
[sudo] password for dyve:
make -C /lib/modules/2.6.23.11-med/build M=/usr/src/linux-2.6.23.11/drivers/hello modules
make[1]: Entering directory `/usr/src/linux-2.6.23.11′
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-2.6.23.11′
dyve@a6j:/usr/src/linux-2.6.23.11/drivers/hello$
sudo make
Troveremo il modulo compilato, chiamato hello-2.ko. Carichiamolo con:
sudo insmod hello-2.ko
A questo punto, controllando la lista moduli con lsmod, dovremmo trovare:
dyve@a6j:~$ modinfo hello-2
filename: /lib/modules/2.6.23.11-med/kernel/drivers/hello/hello-2.ko
srcversion: EC158DBA28FBDA79FD3E6E1
depends:
vermagic: 2.6.23.11-med SMP preempt mod_unload CORE2
dyve@a6j:~$
Cosa manca?..naturalmente, per non dover ogni volta entrare nella directory /usr/src/linux-2.6.23.11/drivers/hello e lanciare insmod, copiamo hello-2.ko nella directory di installazione dei moduli, com questi semplici comandi:
sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/hello
sudo cp -v /usr/src/linux-2.6.23.11/drivers/hello/hello.ko /lib/modules/$(uname -r)/kernel/drivers/hello/
Apriamo il file /etc/modules, file che ci permette di caricare i moduli al boot, ed aggiungiamo hello-2 nella lista gia’ presente:
sudo kate /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.
fglrx
lp
sbp2
hello-2
Riavviamo il sistema, e al successivo log-in interrogando dmesg, vedremo il messaggio contenuto nel playload del modulo da noi compilato:
dyve@a6j:~$ dmesg | grep Hello
[ 38.547118] Hello, world 2
[ 3195.066317] Hello, world 2
dyve@a6j:~$
Per “scaricare” tale modulo, ricorriamo al solito modprobe:
sudo modprobe -r hello-2
Leggiamo nuovamente l’output di dmesg e questa volta troveremo il messaggio di “addio”:
[ 3591.524004] Goodbye, world 2
Oppure:
sudo tail -f /var/log/messages
Dec 18 12:49:41 a6j kernel: [ 1548.256222] Goodbye, world 2
Dec 18 13:04:33 a6j — MARK –
Dec 18 13:17:08 a6j kernel: [ 3195.066317] Hello, world 2
Dec 18 13:23:45 a6j kernel: [ 3591.524004] Goodbye, world 2
- Esempio tradotto ed adattato da:
Guida alla programmazione moduli del kernel
Il tuo indirizzo ip:
184.72.184.104
Commenti via Facebook:












wow… questa è una figata!
:O
AlgolQuota
bhe..questo articolo, cosi’ come accade da qualche mese a sta parte, sembra merda secca per concimare i prati..mentre se apri un blog fresco fresco..e ci incolli le foto della Manadou, o come cacchio si chiama, nuda (un cesso da paura tra l’altro) sei gia’ nei primi 4 blog piu’ quotati di wordpress..
queste cose sono assurde..ora ce le metto pure io due foto di mia sorella che piglia il sole nuda sulla spiaggia di Ostia..
divilinuQuota
Dal codice di hello-2.c si sono "volatilizzati" i nomi dei file dagli include
Andrea (Z3n0)Quota
@Andrea
cavolo e’ vero, deve essere la solita formattazione di WordPress, ora sistemo subito..grazie della segnalazione
divilinuQuota
a me della monadù non me ne frega niente… sei il secondo che la nomina oggi… sarà successo qualcosa di gossip, ma anche chi se ne frega!!!
), per me questo articolo è una figata… visto che mostra tutta la flessibilità di un sistema linux!
se devo leggere qualcosa che nn siano libri di studio allora che siano cose che mi facciano imparare qualcosa (oppure i sottotitoli di Heroes
AlgolQuota
Ti capisco, addirittura nel mio caso la “concorrenza” sono altri articoli dello stesso blog… ma è deprimente lo stesso. Un articolo sulla compilazione di un certo pacchetto Debian, su cui ho sputato sangue – e continuo a sputarlo, visto che devo rispondere a tutte le richieste di aiuto che lo stesso genera – fa in media 20 visite al giorno (nonostante sia al primo posto su Google) mentre un altro post, frettoloso, che ho scritto, quasi per sbaglio, dopo aver risolto alcuni problemi con aMule, a volte da solo fa 200 visite…
Gli articoli migliori sono sempre quelli che generano meno visite, purtroppo.
Comunque, guardando among.us, hai un numero di visite di tutto rispetto
E guardando l’altro blog, che citi “tra le righe”, avrà sì parecchie visite, ma rispetto al tuo mi sembra molto meno commentato… Si vede subito, tra i due, chi è il blog di qualità.
Insomma… continua così! ^_^ (io, nonostante non usi né Ubuntu né, al momento, KDE, ho lo stesso divilinu nel feed reader… e da parecchio ormai
Mentre difficilmente, invece, aggiungerò l’altro blog =) )
notoriousxlQuota
grande Divi!
grande articolo! davvero interessante…
sono queste le cose che ti fanno apprezzare linux, e ti fanno capire meglio come funziona il sistema…
mi piacerebbe vedere più spesso articoli di questo genere sul tuo blog… (altro che KDE… scherzo! ^^ )
ps: aspetto con ansia le foto di tua sorella… =)
gieffeQuota
Ottimo,
Potresti fare (se hai voglia)
un corso a puntate sul kernel.
Tipo:
Identificare l’hardware.
Identificare le cose da compilare nel kernel (*)
Identificare le cose da compilare come moduli (M)
telperionQuota
tua sorella è possibile caricarla in userspace aggiungendo funzionalità al mio kernel?
pixQuota
pixQuota
uhm…qualcuno mi spiega cosa sono i kernel-header?
ugaciakaQuota
@telpe
ottima idea..la metto nella todolist
@pix
mia sorella gira parecchio in userspace..di notte sopratutto
@Ugaciaka
sono un insieme di files necessari alla compilazione dei moduli
@tutti
grazie..
divilinuQuota
però i kernel-header servono alla compilazione del modulo senza vere i sorgenti del kernel…vorrei avere delle informazioni più precise ma non ho trovato niente (in italiano)…PS ho guardato anche alcune guide di debianizzati.org
ugaciakaQuota
@uguciaka
si esatto, nel caso mancassero i sorgenti, i moduli utilizzano gli headers per la compilazione..
Non c’e’ molto da sapere…
divilinuQuota
Ok grazie, OT se ti può far piacere non so chi sia Manadou
ugaciakaQuota