43
contributi
Riga 39: | Riga 39: | ||
Il file <code>/proc/kallsyms</code> contiene tutti i simboli che il kernel conosce e che sono accessibili al tuo modulo poichè condividono lo spazio del codice (codespace) del kernel. | Il file <code>/proc/kallsyms</code> contiene tutti i simboli che il kernel conosce e che sono accessibili al tuo modulo poichè condividono lo spazio del codice (codespace) del kernel. | ||
===Code | ===Code space=== | ||
La gestione della memoria è un argomento davvero complicato---la maggior parte del libro della O'Reilly `Understanding The Linux Kernel' tratta solo la gestione della memoria!. Non ci dichiariamo esperti nella gestionde della memoria, ma abbiamo bisogno di sapere un paio di cose preoccupanti sulla scrittura di veri moduli. | |||
Se non hai mai pensato a cosa un segfault significhi, potresti essere sorpreso di sentire che i puntatori non puntano realmente a locazioni di memoria. Non a quelle reali. Quando un processo viene creato, il kernel mette da parte una porzione della reale memoria fisica e la passa al processo per utilizzarla per conservare il codice d'esecuzione, le variabili, lo stack, l'heap ed altre cose che uno scenziato del computer vorrebbe sapere[2]. Questa memoria inizia con 0x00000000 e si estende verso l'alto fino a quanto necessita. Poichè lo spazio della memoria di due processi non si sovrappone, ogni processo che può accedere ad un indirizzo di memoria, per esempio 0xbffff978, avrà accesso ad una differente locazione nella reale memoria fisica!. I processi accedono ad un indice chiamato 0xbffff978 che punta a qualche tipo di offset nella regione di memoria messa da parte per quel particolare processo. Per la maggior parte, un processo come il nostro "Ciao Mondo" non può accedere allo spazio di un altro processo, sebbene ci siano modi dei quali parleremo dopo. | |||
Il kernel ha il suo spazio di memoria come gli altri. Poichè il modulo è un codice che può essere dinamicamente inserito e rimosso del kernel (a differenza di un semi-autonomo oggetto), il modulo condivide il codespace del kernel invece di averne uno tutto suo. Perciò, se il tuo modulo va in segfault, il kernel va in segfault. E se inizi a scrivere sopra i dati per via di un errore off-by-one, ti facendo una camminata sui dati del kernel (o il codice). Questo è peggio di come souni, quindi fai del tuo meglio per essere attento. | |||
Tra l'altro, voglio evidenziare che la discussione sopra citata è vera per qualsiasi sistema operativo che usa un kernel monolitico[3]. Ci sono cose chiamate microkernel che hanno i moduli con i proprio codespace. GNU Hurd e QNX Neutrino sono due esempi di microkernel. | |||
===Driver dei device=== | ===Driver dei device=== |
contributi