LKMPG: Ciao Mondo: differenze tra le versioni

m
nessun oggetto della modifica
Nessun oggetto della modifica
mNessun oggetto della modifica
Riga 7: Riga 7:
Qui vediamo il modulo più semplice possibile. Non compilarlo ancora; analizzeremo la compilazione di un modulo nella prossima sezione.
Qui vediamo il modulo più semplice possibile. Non compilarlo ancora; analizzeremo la compilazione di un modulo nella prossima sezione.


'''Esempio 2-1. hello-1.c'''
'''Esempio 3-1. hello-1.c'''


<pre>
<pre>
Riga 48: Riga 48:
==Compilare i moduli del kernel==
==Compilare i moduli del kernel==


I moduli del kernel devono essere compilati un po' differentemente dalle applicazioni userspace regolari. Le vecchie versioni del kernel richiedevano molta attenzione riguardo queste impostazioni, che sono, di solito, memorizzare nei Makefiles.
I moduli del kernel devono essere compilati un po' differentemente dalle applicazioni userspace regolari. Le vecchie versioni del kernel richiedevano molta attenzione riguardo queste impostazioni, che sono, di solito, memorizzate nei Makefiles. Sebbene siano organizzate gerarchicamente, sono presenti molte impostazioni ridondanti nei Makefiles e ciò fa in modo che sia abbastanza difficile da mantenere. Fortunatamente, c'è un nuovo modo di fare queste cose, chiamato kbuild, e il processo di generazione dei moduli esterni è adesso completamente integrato nel meccanismo standard. Per saperne di più su come compilare moduli che non fanno parte del kernel ufficile (come ad esempio tutti gli esempi di questa guida), si veda il file <code>linux/Documentation/kbuild/modules.txt</code>.


==Ciao, Mondo (parte 2)==
Analizziamo ora un semplice Makefile per compilare un modulo chiamato <code>hello-1.c</code>:
 
'''Esempio 3-2. Makefile per un modulo basilare del kernel'''
 
<pre>
obj-m += hello-1.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
</pre>
 
Da un punto di vista tecnico solamente la prima linea è realmente necessaria, i target "all" e "clean" sono stati aggiunti per convenienza.
 
Adesso si può compilare il modulo digitando il comando '''make'''. Dovresti ottenere un output che somigli al seguente:
 
<pre>
hostname:~/lkmpg-examples/02-HelloWorld# make
make -C /lib/modules/2.6.11/build M=/root/lkmpg-examples/02-HelloWorld modules
make[1]: Entering directory `/usr/src/linux-2.6.11'
  CC [M]  /root/lkmpg-examples/02-HelloWorld/hello-1.o
Building modules, stage 2.
  MODPOST
  CC      /root/lkmpg-examples/02-HelloWorld/hello-1.mod.o
  LD [M]  /root/lkmpg-examples/02-HelloWorld/hello-1.ko
make[1]: Leaving directory `/usr/src/linux-2.6.11'
hostname:~/lkmpg-examples/02-HelloWorld#
</pre>
 
Si noti che il kernel 2.6 introduce una nuova convenzione sui nomi dei file: i moduli del kernel hanno adesso l'estensione <code>.ko</code> (invece della vecchia estensione <code>.o</code>) che permette una facile distinzione dai file oggetto convenzionali. La ragione di ciò risiede nel fatto che i file <code>.ko</code> contengono una sezione addizionale (.modinfo) in cui vengono mantenute informazioni addizionali. Vedremo tra breve a cosa possono servire queste informazioni.
 
Per vedere di che tipo di informazione si tratta viene usato il comando: '''modinfo hello-*.ko'''
<pre>
hostname:~/lkmpg-examples/02-HelloWorld# modinfo hello-1.ko
filename:      hello-1.ko
vermagic:      2.6.11 preempt PENTIUMII 4KSTACKS gcc-3.3
depends:
</pre>
Niente di spettacolare, finora. Però se utilizziamo modinfo su uno degli esempi futuri, <code>hello-5.ko</code>, vedremo:
 
<pre>
hostname:~/lkmpg-examples/02-HelloWorld# modinfo hello-5.ko
filename:      hello-5.ko
license:        GPL
author:        Peter Jay Salzman
vermagic:      2.6.11 preempt PENTIUMII 4KSTACKS gcc-3.3
depends:
parm:          myintArray:An array of integers (array of int)
parm:          mystring:A character string (charp)
parm:          mylong:A long integer (long)
parm:          myint:An integer (int)
parm:          myshort:A short integer (short)
hostname:~/lkmpg-examples/02-HelloWorld#
</pre>
 
Sono presenti moltissime informazioni. Il nome dell'autore per la segnalazione di eventuali bug, informazioni sulla licenza, persino una piccola descrizione dei parametri che il modulo accetta.
 
Ulteriori dettagli sui Makefiles dei moduli del kernel sono disponibili in <code>linux/Documentation/kbuild/makefiles.txt</code>. Bisogna essere sicuri di aver letto quanto appena esposto e il file specificato prima di iniziare a mettere mano sui Makefiles: in questo si rispagna molto lavoro.
 
Adesso è arrivato il momento di inserire il nostro modulo fresco di compilazione all'interno del kernel con '''insmod ./hello-1.ko'''.
168

contributi