LKMPG: Ciao Mondo: differenze tra le versioni

Riga 32: Riga 32:
</pre>
</pre>


I moduli del kernel devono avere almeno due funzioni. Una funzione "iniziale" (inizializzazione) detta <code>init_module()</code> che è chiamata quando il modulo è inserito nel kernel tramite insmod, e una funzione "finale" (di pulizia) detta <code>cleanup_module()</code> che è chiamata prima che il modulo venga rimosso con rmmoded. In realtà, le cose sono cambiate a partire dal kernel 2.3.13. Si può utilizzare qualunque nome che piaccia per la funzione di inizializzazione e di cleanup, e si imparerà a farlo nella Sezione XXXX2.3XXXX. Infatti, il nuovo metodo è quello preferito. Comunque, molti continuano ad utilizzare init_module() e cleanup_module() per le proprie funzioni iniziali e finali.
I moduli del kernel devono avere almeno due funzioni. Una funzione "iniziale" (inizializzazione) detta <code>init_module()</code> che è chiamata quando il modulo è inserito nel kernel tramite insmod, e una funzione "finale" (di pulizia) detta <code>cleanup_module()</code> che è chiamata prima che il modulo venga rimosso con rmmod. In realtà, le cose sono cambiate a partire dal kernel 2.3.13. Si può utilizzare qualunque nome che piaccia per la funzione di inizializzazione e di pulizia, e si imparerà a farlo nella Sezione XXXX2.3XXXX. Infatti, il nuovo metodo è quello preferito. Comunque, molti continuano ad utilizzare init_module() e cleanup_module() per le proprie funzioni iniziali e finali.


Tipicamente, <code>init_module()</code> o registra un handler con il kernel per fare una serie di azioni, oppure rimpiazza una della funzioni del kernel stesso con un codice proprio (usualmente questo codice fa una serie di azioni e poi chiama la funzione originale). Si suppone che la funzione <code>cleanup_module()</code> disfaccia tutto ciò che ha fatto <code>init_module()</code>, in modo tale che il modulo possa essere rimosso tranquillamente.
Tipicamente, <code>init_module()</code> o registra un handler con il kernel per fare una serie di azioni, oppure rimpiazza una della funzioni del kernel stesso con un codice proprio (usualmente questo codice fa una serie di azioni e poi chiama la funzione originale). Si suppone che la funzione <code>cleanup_module()</code> disfaccia tutto ciò che ha fatto <code>init_module()</code>, in modo tale che il modulo possa essere rimosso tranquillamente.
Riga 40: Riga 40:
===Introduzione a <code>printk()</code>===
===Introduzione a <code>printk()</code>===


Nonostante quello che si potrebbe pensare, <code>printk()</code> non aveva lo scopo di comunicare informazioni all'utente, anche se l'abbiamo utilizzato esattamente per questo in <code>hello-1</code>! E' stato pensato, invece, per essere un meccanismo di logging per il kernel, ed è utilizzato per loggare informazioni e mostrare dei warning. Perciò, ogni dichiarazione di <code>printk()</code> viene fornita di un livello di priorità, che, nell'esempio, è la <code>KERN_ALERT</code> (<code><1></code>). Ci sono 8 priorità e il kernel possiede delle macro per queste, quindi non c'è il bisogno di utilizzare numeri criptici. Si possono vedere le macro (e il loro significato) nel file <code>linux/kernel.h</code>. Se non si specifica un livello di priorità, verrà utilizzata quella di default: <code>DEFAULT_MESSAGE_LOGLEVEL</code>.
Nonostante quello che si potrebbe pensare, <code>printk()</code> non aveva lo scopo di comunicare informazioni all'utente, anche se l'abbiamo utilizzato esattamente per questo in <code>hello-1</code>! E' stato pensato, invece, per essere un meccanismo di logging per il kernel, ed è utilizzato per loggare informazioni e mostrare dei warning. Perciò, ogni dichiarazione di <code>printk()</code> viene fornita di un livello di priorità, che, nell'esempio, è la <code>KERN_ALERT</code> (<code><1></code>). Ci sono 8 priorità e il kernel possiede delle macro per queste, quindi non c'è il bisogno di utilizzare numeri criptici. Si possono vedere le macro (e il loro significato) nel file <code>linux/kernel.h</code>. Se non si specifica un livello di priorità, verrà utilizzata quello di default: <code>DEFAULT_MESSAGE_LOGLEVEL</code>.


E' importante prestare una certa attenzione nel leggere le macro di priorità. L'header file descrive anche cosa significa ogni priorità. In pratica, è bene non utilizzare i numeri, come <code><4></code>. Si utilizzino sempre le macro, come <code>KERN_WARNING</code>.
E' importante prestare una certa attenzione nel leggere le macro di priorità. L'header file descrive anche cosa significa ogni priorità. In pratica, è bene non utilizzare i numeri, come <code><4></code>. Si utilizzino sempre le macro, come <code>KERN_WARNING</code>.
43

contributi