LKMPG: Ciao Mondo: differenze tra le versioni

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 alla funzione di init di essere distrutta e alla memoria relativa di essere liberata una volta che la funzione termina per i driver built-in, ma non per i moduli caricabili.
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.
168

contributi