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

Valutazione 3.00 su 5
happy wheels 2 demo

Category:

Senza categoria

Tags:

,

Commenti via Facebook:

Leave a Reply

Your email address will not be published. Required fields are marked *

*

16 Comments

  • Algol ITALY 9 anni ago

    wow… questa è una figata!
    :O

      Quota

  • 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

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

      Quota

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

      Quota

  • Algol ITALY 9 anni ago

    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 😀 ), per me questo articolo è una figata… visto che mostra tutta la flessibilità di un sistema linux! 😉

      Quota

  • 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 😉 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

  • gieffe ITALY 9 anni ago

    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

  • telperion ITALY 9 anni ago

    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

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

      Quota

  • 😀

      Quota

  • ugaciaka ITALY 9 anni ago

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

      Quota

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

      Quota

  • ugaciaka ITALY 9 anni ago

    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

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

      Quota

  • ugaciaka ITALY 9 anni ago

    Ok grazie, OT se ti può far piacere non so chi sia Manadou 😀

      Quota

Pings

  1. Top Posts « WordPress.com UNITED STATES 19 dicembre 2007