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