2012-07-25 13 views
5

Sto scrivendo un driver di periferica che, tra le altre cose, alloca un blocco di memoria con kmalloc. Questa memoria viene liberata quando il programma utente chiude il file. In uno dei miei esperimenti, il programma utente si è arrestato in modo anomalo senza chiudere il file.la memoria allocata da kmalloc() viene liberata automaticamente?

Qualcosa avrebbe liberato questa memoria?

In un altro esperimento, ho spostato il kfree() dalla funzione close() alla funzione module_exit(). Quando ho eseguito il programma utente due volte consecutive, ho chiamato di nuovo kmalloc con lo stesso puntatore di prima, senza prima liberarlo. Così, ho perso un puntatore a quella memoria, e non posso liberarlo.

Questa memoria è stata persa nel sistema fino al riavvio o verrà liberata quando scarico il driver?

+2

Probabilmente ci vorrà un riavvio. Immagino che il kernel non possa liberare magicamente la memoria perduta. Il modo giusto per farlo sarebbe quello di collegare l'uscita dal programma e liberare risorse allora. Questo è lo stesso tempo in cui i descrittori di file di un programma vengono ripuliti. – Wug

risposta

8

La memoria del kernel non viene mai liberata automaticamente. Questo include kmalloc.

Tutta la memoria relativa a un descrittore di file aperto deve essere rilasciata quando il file viene chiuso.
Quando un processo termina, per qualsiasi motivo (incluso kill -9), tutti i descrittori di file aperti vengono chiusi e viene richiamata la funzione di chiusura del driver. Quindi, se sei libero lì, niente di ciò che il processo può fare farà sì che la memoria rimanga dopo che il processo è morto.

3

Si prega di non mettere in relazione la propria esperienza nello spazio utente con la programmazione del kernel.

Cosa intendo con questo?

I processi normali ottengono una pulizia per loro una volta che escono, questo non è il caso dei moduli del kernel perché non sono realmente processi.

Tecnicamente, quando si carica un modulo e si chiama kmalloc, ciò che si è fatto è stato che si chiedeva al kernel di allocare memoria per voi nello spazio del kernel, tecnicamente è una nuova memoria per l'intero kernel, quindi anche se si scarica il tuo modulo, quella memoria del kernel allocata è lì a meno che non venga esplicitamente liberato.

In termini semplici rispondendo alla tua domanda: Ogni kmalloc ha bisogno di un kfree, altrimenti la memoria rimarrà lì fino a quando il sistema è attivo.

Problemi correlati