[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) modules

clean:
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

Related Posts Plugin for WordPress, Blogger...

Il tuo indirizzo ip:
184.72.184.104

Valutazione 3.00 su 5

Commenti via Facebook:

16 Responses to [Kernel] Comprendere il funzionamento dei moduli

  1. Algol ITALY scrive:

    wow… questa è una figata!
    :O

      Quota

  2. divilinu ITALY scrive:

    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..

      Quota

  3. Andrea (Z3n0) SWEDEN scrive:

    Dal codice di hello-2.c si sono "volatilizzati" i nomi dei file dagli include ;)

      Quota

  4. divilinu ITALY scrive:

    @Andrea
    cavolo e’ vero, deve essere la solita formattazione di WordPress, ora sistemo subito..grazie della segnalazione ;)

      Quota

  5. Algol ITALY scrive:

    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!!!
    se devo leggere qualcosa che nn siano libri di studio allora che siano cose che mi facciano imparare qualcosa (oppure i sottotitoli di Heroes :D ), per me questo articolo è una figata… visto che mostra tutta la flessibilità di un sistema linux! ;)

      Quota

  6. notoriousxl ITALY scrive:

    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..

    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 :wink: 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 =) )

      Quota

  7. gieffe ITALY scrive:

    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… =)

      Quota

  8. telperion ITALY scrive:

    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)
    :)

      Quota

  9. pix ITALY scrive:

    tua sorella è possibile caricarla in userspace aggiungendo funzionalità al mio kernel?

      Quota

  10. ugaciaka ITALY scrive:

    uhm…qualcuno mi spiega cosa sono i kernel-header?

      Quota

  11. divilinu ITALY scrive:

    @telpe
    ottima idea..la metto nella todolist
    @pix
    mia sorella gira parecchio in userspace..di notte sopratutto :D
    @Ugaciaka
    sono un insieme di files necessari alla compilazione dei moduli
    @tutti
    grazie..

      Quota

  12. ugaciaka ITALY scrive:

    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

      Quota

  13. divilinu ITALY scrive:

    @uguciaka
    si esatto, nel caso mancassero i sorgenti, i moduli utilizzano gli headers per la compilazione..
    Non c’e’ molto da sapere…

      Quota

  14. ugaciaka ITALY scrive:

    Ok grazie, OT se ti può far piacere non so chi sia Manadou :-D

      Quota

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Posicionamiento web SEO