168
contributi
Nessun oggetto della modifica |
|||
Riga 165: | Riga 165: | ||
==Ciao, Mondo (parte 3): Le macro __init e __exit== | ==Ciao, Mondo (parte 3): Le macro __init e __exit== | ||
Ora vedremo una caratteristica dei kernel 2.2 e superiori. Si faccia caso alla diversa definizione delle funzioni di init e di cleanup. La macro <code>__init</code> permette | Ora vedremo una caratteristica dei kernel 2.2 e superiori. Si faccia caso alla diversa definizione delle funzioni di init e di cleanup. La macro <code>__init</code> permette, per i driver built-in, di ignorare la funzione init di essere ignorata e di liberare la memoria ad essa associata una volta che la funzione termina. Lo stesso non vale per i moduli caricabili: infatti quanto abbiamo detto vale quando viene invocata la funzione di init. | ||
Esiste anche la macro <code>__initdata</code> che funziona similmente a <code>__init</code> ma per le "variabili di init" piuttosto che per le funzioni. | |||
La macro <code>__exit</code> fa in modo che la funzione venga ignorata quando il modulo è compilato staticamente nel kernel, e come <code>__init</code>, l'effetto è diverso per i moduli caricabili. Ancora: la macro <code>__exit</code> è un segna-posto per indicare di liberare memoria una volta che termina la funzione di cleanup; a differenza dei moduli caricabili, i driver built-in non hanno bisogno della funzione di clean-up. | |||
Queste macro sono definite in <code>linux/init.h</code> e servono per liberare la memoria del kernel. Quando il kernel viene avviato e si nota qualcosa come <code>Freeing unused kernel memory: 236k freed</code>, questo è precisamente ciò che il kernel sta liberando. | |||
'''Esempio 3-5 hello-3.c''' | |||
<pre> | |||
/* | |||
* hello-3.c - Illustrazione delle macro __init, __initdata e __exit | |||
*/ | |||
#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 hello3_data __initdata = 3; | |||
static int __init hello_3_init(void) | |||
{ | |||
printk(KERN_INFO "Ciao, mondo %d\n", hello3_data); | |||
return 0; | |||
} | |||
static void __exit hello_3_exit(void) | |||
{ | |||
printk(KERN_INFO "Arrivederci, mondo 3\n"); | |||
} | |||
module_init(hello_3_init); | |||
module_exit(hello_3_exit); | |||
</pre> | |||
==Ciao Mondo (parte 4): Licenza e Documentazione dei moduli | |||
Se state utilizzando un kernel 2.4 o superiore, quando caricate un modulo proprietario è possibile che siate avvisati con un messaggio del genere: | |||
<pre> | |||
# insmod xxxxxx.o | |||
Warning: loading xxxxxx.ko will taint the kernel: no license | |||
See http://www.tux.org/lkml/#export-tainted for information about tainted modules | |||
Module xxxxxx loaded, with warnings | |||
</pre> | |||
Nei kernel 2.4 e superiori, è stato messo a punto un meccanismo che permette di identificare il codice con licenza GPL (e simili) in modo tale che la gente può essere avvisata se il codice non è open-source. Ciò si può realizzare con la macro <code>MODULE_LICENSE</code> che è mostrata nel prossimo pezzo di codice. Impostando la licenza GPL, è possibile fare in modo che l'avviso venga stampato ugualmente. Questo meccanismo è definito e documentato in <code>linux/module.h</code>: | |||
<pre> | |||
/* | |||
* The following license idents are currently accepted as indicating free | |||
* software modules | |||
* | |||
* "GPL" [GNU Public License v2 or later] | |||
* "GPL v2" [GNU Public License v2] | |||
* "GPL and additional rights" [GNU Public License v2 rights and more] | |||
* "Dual BSD/GPL" [GNU Public License v2 | |||
* or BSD license choice] | |||
* "Dual MIT/GPL" [GNU Public License v2 | |||
* or MIT license choice] | |||
* "Dual MPL/GPL" [GNU Public License v2 | |||
* or Mozilla license choice] | |||
* | |||
* The following other idents are available | |||
* | |||
* "Proprietary" [Non free products] | |||
* | |||
* There are dual licensed components, but when running with Linux it is the | |||
* GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL | |||
* is a GPL combined work. | |||
* | |||
* This exists for several reasons | |||
* 1. So modinfo can show license info for users wanting to vet their setup | |||
* is free | |||
* 2. So the community can ignore bug reports including proprietary modules | |||
* 3. So vendors can do likewise based on their own policies | |||
*/ | |||
</pre> | |||
Similmente, la macro <code>MODULE_DESCRIPTION()</code> è utilizzata per descrivere ciò fa il modulo, la macro <code>MODULE_AUTHOR</code> dichiara il nome dell'autore, e la <code>MODULE_SUPPORTED_DEVICE()</code> dichiara quali tipi di device sono supportati dal modulo. | |||
Queste macro sono tutte definite in <code>linux/module.h</code> e non sono usate dal kernel. Sono semplicemente necessarie per la documentazione e possono essere analizzate con uno strumento come objdump. Come esercizio per l'utente, si provi a cercare queste macro in <code>linux/driver</code> per vedere come gli autori dei moduli le utilizzano per la documentazione. |
contributi