LKMPG: Introduzione: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
nuova categoria
(nuova categoria)
 
(9 versioni intermedie di 3 utenti non mostrate)
Riga 1: Riga 1:
{{Template:LKMPG}}
{{Template:LKMPG}}
==Cos'è un modulo del kernel?==
==Cos'è un modulo del kernel?==


Riga 47: Riga 46:
====Modversioning====
====Modversioning====


Un modulo compilato per un certo kernel non verrà caricato se si avvia un kernel differente a meno che non venga abilitata l'opzione <code>CONFIG_MODVERSIONS</code> nello stesso. Per ora non andremo ad analizzare la modversions. Fin quando non copriremoquesto argomento, gli esempi della guida potrebbero non funzionare se si sta utilizzando un kernel con il modversioning abilitato. Comunque, la maggior parte delle distribuzioni Linux hanno un kernel con l'opzione abilitata. Se si riscontrano problemi nel caricare i moduli per errori di versioning, si compili un kernel con il modversioning disabilitato.
Un modulo compilato per un certo kernel non verrà caricato se si avvia un kernel differente a meno che non venga abilitata l'opzione <code>CONFIG_MODVERSIONS</code> nello stesso. Per ora non andremo ad analizzare la modversions. Fin quando non copriremo questo argomento, gli esempi della guida potrebbero non funzionare se si sta utilizzando un kernel con il modversioning abilitato. Comunque, la maggior parte delle distribuzioni Linux hanno un kernel con l'opzione abilitata. Se si riscontrano problemi nel caricare i moduli per errori di versioning, si compili un kernel con il modversioning disabilitato.


====Usare X====
====Usare X====


E' altamente raccomandato che tutti gli esampi discussi in questa guida vengano digitati, compilati e caricati. E' anche altamente raccomandato che si faccia tutto questo da una console. Non si dovrebbe lavorare con questa roba sul server X.
E' altamente raccomandato che tutti gli esempi discussi in questa guida vengano scritti, compilati e caricati. E' anche altamente raccomandato che si faccia tutto questo da una console. Non si dovrebbe lavorare con questa roba sul server X.


I moduli non possono stampare sullo schermo così come fa una <code>printf()</code>, ma possono loggare informazioni e warning, i quali finiscono per essere stampati sullo schermo, ma solo si sta utilizzando una console. Se si inserisce un modulo con insmod da xterm, le informazioni e i warning saranno loggati, ma solo sul proprio file di log. Non si vedrà niente finquando non si analizza questo file. Per avere un accesso immediato a questa informazione, si lavori su una console.
I moduli non possono stampare sullo schermo così come fa una <code>printf()</code>, ma possono loggare informazioni e warning, i quali finiscono per essere stampati sullo schermo, ma solo se si sta utilizzando una console. Se si inserisce un modulo con insmod da xterm, le informazioni e i warning saranno loggati, ma solo sul proprio file di log. Non si vedrà niente finquando non si analizza questo file. Per avere un accesso immediato a questa informazione, si lavori su una console.


====Problemi di compilazione e versioni del kernel====
====Problemi di compilazione e versioni del kernel====
Riga 59: Riga 58:
Molto spesso, le distribuzioni Linux distribuiscono il sorgente del kernel patchato in varie modalità non standard che possono creare problemi.
Molto spesso, le distribuzioni Linux distribuiscono il sorgente del kernel patchato in varie modalità non standard che possono creare problemi.


Un problema veramente comune è che certe distribuzioni Linux distribuiscono gli headers del kernel incompleti. Ci sarà la necessità di compilare il proprio codice utilizzando vari file di header del kernel Linux. La legge di Murphy stabilisce che gli header non presenti solo esattamente quelli di cui si ha bisogno affinchè il proprio modulo funzioni.
Un problema veramente comune è che certe distribuzioni Linux distribuiscono gli headers del kernel incompleti. Ci sarà la necessità di compilare il proprio codice utilizzando vari file di header del kernel Linux. La legge di Murphy stabilisce che gli header non presenti sono esattamente quelli di cui si ha bisogno affinchè il proprio modulo funzioni.


Per evitare questi due problemi, raccomando caldamente di scaricare, compilare ed avviare un kernel Linux fresco e disponibile che può essere scaricato da qualsiasi mirror ufficiale del kernel. Vedi il Linux Kernel HOWTO per maggiori dettagli.
Per evitare questi due problemi, raccomando caldamente di scaricare, compilare ed avviare un kernel Linux fresco e disponibile che può essere scaricato da qualsiasi mirror ufficiale del kernel. Vedi il Linux Kernel HOWTO per maggiori dettagli.


Ironicamente, quanto detto può causare problemi. Di default, il compilatore gcc sul proprio sistema può cercare gli header del kernel nelle locazioni standard piuttosto che laddove si è appena installata la nuova versione del kernel (usualmente in <code>/usr/src/</code>). Ciò può essere risolto usando l'opzione <code>-I</code> di gcc.
Ironicamente, quanto detto può causare problemi. Di default, il compilatore gcc sul proprio sistema può cercare gli header del kernel nelle locazioni standard piuttosto che laddove si è appena installata la nuova versione del kernel (di solito in <code>/usr/src/</code>). Ciò può essere risolto usando l'opzione <code>-I</code> di gcc.


==Note==
==Note==
* [1] Nelle prime versioni di Linux, era conosciuto come kerneld
* [1] Nelle prime versioni di Linux, era conosciuto come kerneld


* [2] Se tale file esiste. Nota che l'effittivo comportamento potrebbe dipendere dalla distribuzione. Se sei interessanto ai dettagli, leggi le man page su module-init-tools, e controlla cosa succede realmente. Potresti usare qualcosa come strace modprobe dummy per vedere come possa essere caricato il modulo dummy.ko. Per tua informazione: il modulo dummy.ko di cui sto parlando qui è una parte della mainline del kernel e può essere trovato nella sezione networking. E' necessario che sia compilato come un modulo (e installato, ovviamente) per far funzionare il tutto.
* [2] Se tale file esiste. Nota che l'effettivo comportamento potrebbe dipendere dalla distribuzione. Se sei interessanto ai dettagli, leggi le man page su module-init-tools, e controlla cosa succede realmente. Potresti usare qualcosa come '''strace modprobe dummy''' per vedere come viene caricato il modulo dummy.ko. Per tua informazione: il modulo dummy.ko di cui sto parlando qui è parte della mainline del kernel e può essere trovato nella sezione networking. E' necessario che sia compilato come un modulo (e installato, ovviamente) per far funzionare il tutto.


* [3] Se stai modificando il kernel, per evitare sovrascrittura dei moduli esistenti potresti volere usare la variabile EXTRAVERSION nel Makefile del kernel per creare una directory separata.
* [3] Se stai modificando il kernel, per evitare sovrascrittura dei moduli esistenti potresti volere usare la variabile EXTRAVERSION nel Makefile del kernel per creare una directory separata.
[[Categoria:Linux Kernel Module Programming Guide]]
6 999

contributi

Menu di navigazione