LKMPG: Ciao Mondo: differenze tra le versioni

Nessun oggetto della modifica
Riga 118: Riga 118:


==Ciao, Mondo (parte 2)==
==Ciao, Mondo (parte 2)==
Dalla versione 2.4 del kernel Linux, si possono rinominare le funzioni di init e cleanup dei propri moduli; infatti non devono essere chiamate per forza rispettivamente <code>init_module()</code> e <code>cleanup_module</code>. Questo è reso possibile della macro <code>module_init()</code> e module_exit()</code>. Queste macro sono definite in <code>linux/init.h</code>. L'unica attenzione da avere è quella di definire le funzioni di init e cleanup prima di chiamare le macro, pena errori di compilazione. Vediamo un esempio di questa tecnica:
'''Esempio 3-3. hello-2.c'''
<pre>
/* 
*  hello-2.c - Dimostrazione dell'utilizzo delle macro module_init() e module_exit().
*  Questa tecnica è da preferire all'uso di init_module() e cleanup_module()
*/
#include <linux/module.h> /* Necessario per tutti i moduli */
#include <linux/kernel.h> /* Necessario per KERN_INFO */
#include <linux/init.h> /* Necessario per le macro */
static int __init hello_2_init(void)
{
printk(KERN_INFO "Ciao, mondo 2\n");
return 0;
}
static void __exit hello_2_exit(void)
{
printk(KERN_INFO "Arrivederci, mondo 2\n");
}
module_init(hello_2_init);
module_exit(hello_2_exit);
</pre>
Quindi, a questo punto, abbiamo due moduli reali sotto le nostre mani. Aggiungere un altro modulo è semplice:
'''Esempio 3-4. Makefile for entrambi i nostri moduli'''
<pre>
obj-m += hello-1.o
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
</pre>
Adesso diamo un occhiata a <code>linux/drivers/char/Makefile</code> per un esempio concreto. Come si può vedere, qualcosa è stata inserita nel kernetl (obj-y) ma dove sono andate tutte le obj-m? Chi ha familiarità con gli script di shell può facilmente individuarli. Per quelli che non hanno familiarità, le voci obj-$(CONFIG_FOO) che si vedono ovunque vengono espanse in obj-y o in obj-m a seconda del fatto che la variabile CONFIG_FOO è stata settata a 'y' o a 'm'. Già che ci siamo, queste erano esattamente il tipo di variabili che avete impostato nel file <code>linux/.config</code> l'ultima volta che avete dato il comando '''make menuconfig''' o qualcosa di simile.
168

contributi