Building and Running Modules¶
Kernel Modules Versus Applications¶
L’immagine a pagina 19 spiega come funziona il linking di un modulo al kernel e l’utilizzo delle sue funzionalita”. Non ho capito molto bene questa immagine.
Concurrency in the Kernel¶
Non ho molto idea di come funzionino di preciso gli interrupts di cui parla in questo paragrafo:
Ogni input fisico / eccezione / segnale asincrono puo” essere considerato un
interrupt?Per esempio, ogni tasto che schiaccio sulla tastiera (che e” un segnale sicuramente asincrono) e” un
interrupt?Ogni
interruptha bisogno di un handler?Come sono implementati questi handlers?
Come possono astrazioni software (come timer del kernel) a funzionare in modo asincrono?
In che senso il mio codice puo” esguire concorrentemente in piu” di una CPU nei sistemi SMP? Il kernel e i suoi moduli non eseguono su un unico processore? Come mi devo immaginare il funzionamento del kernel?
Ad oggi io mi immagino i moduli del kernel come del semplice codice collegato a quello del kernel e che non differisce in modo sostanziale da questo.
Inoltre mi immagino che i diversi moduli offrano funzionalita” ad altri moduli esporando simboli utilizzati da altro codice oppure vengano utilizzati come
interruptshandlers:Esempio
Il modulo
LAVATRICE.koimplementa la funzionevoid lavaggio_completo(panni * vestiti)che prende in input unastructpannie ne cambia gli attributi in risposta allaWASH SYSCALL(softwareinterrupt). Questo modulo e” compilato in modo che se e” presente un file che implementa la funzioneint asciuga(panni * vestiti)(ASCIUGATRICE.ko) i panni vengano asciugati, altrimenti no.Nel file
LAVATRICE.c:#define TRUE 1 #define FALSE 0 #include <linux/init.h> . . . void lavaggio_completo(panni * vestiti){ lava(vestiti); #ifdef ASCIUGA err=asciuga(vestiti); if(err==0){ vestiti->asciutti=TRUE; } #else vestiti->asciutti=FALSE; #endif } REGISTER_HANDLER(SYS_WASH,lavaggio_completo);
Nel file
ASCIUGATRICE.c:#include <linux/init.h> . . . #define ASCIUGA int asciuga(panni * vestiti){ . . . return 0 }
Mi immagino quindi il kernel come un insieme di
interruptshandlers.Questi me li immagino implementati come una tabella ad un’indirizzo di memoria specifico che fa corrispondere ogni indirizzo ad un
interrupte a questo un indirizzo di memoria con un handler.In questo modo il processore puo” rispondere alle esigenze asincrone sia a livello hardware che software (quando viene innescato un segnale di questo tipo il processore cambia il proprio stato e va a caricare il codice da una locazione di memoria accordata).
Dal paragrafo che ho letto sembrerebbe invece che il kernel abbia anche una parte sincrona (ovvero del codice che che viene eseguito in assenza da alcun segnale in modo sequenziale e che magari continui l’esecuzione nel caso un interruzzione della normale esecuzione venga gestita con successo).