2012-07-25 17 views
5

Estoy escribiendo un controlador de dispositivo que, entre otras cosas, asigna un bloque de memoria con kmalloc. Esta memoria se libera cuando el programa de usuario cierra el archivo. En uno de mis experimentos, el programa de usuario se bloqueó sin cerrar el archivo.¿la memoria asignada por kmalloc() se libera automáticamente?

¿Habría algo liberado esta memoria?

En otro experimento, moví el kfree() de la función close() a la función module_exit(). Cuando ejecuté el programa de usuario dos veces consecutivas, llamé al kmalloc nuevamente con el mismo puntero que antes, sin liberarlo primero. Por lo tanto, perdí un puntero a esa memoria y no puedo liberarla.

¿Esta memoria se pierde en el sistema hasta que reinicie o se liberará cuando descargue el controlador?

+2

Probablemente llevará un reinicio. Me imagino que el kernel no va a liberar mágicamente la memoria perdida. La forma correcta de hacer esto sería conectar la salida del programa y liberar recursos. Esto es al mismo tiempo que se limpian los descriptores de archivos de un programa. – Wug

Respuesta

8

La memoria del núcleo nunca se libera automáticamente. Esto incluye kmalloc.

Toda la memoria relacionada con un descriptor de archivo abierto debe liberarse cuando se cierra el archivo.
Cuando se cierra un proceso, por cualquier motivo (incluido kill -9), se cierran todos los descriptores de archivo abiertos y se llama a la función de cierre del controlador. Entonces, si liberas allí, nada del proceso puede hacer que la memoria se mantenga después de que el proceso muera.

3

No relacione su experiencia de espacio de usuario con la programación Kernel.

¿Qué quiero decir con esto?

Los procesos normales se limpian una vez que salen, ese no es el caso con los módulos del kernel porque en realidad no son procesos.

Técnicamente, cuando carga un módulo y luego llama a kmalloc, lo que hizo fue pedirle al kernel que le asignara algo de memoria en el kernel, técnicamente es una memoria nueva para todo el kernel, incluso si descarga su módulo, esa memoria kernel asignada está ahí a menos que se libere explícitamente.

En términos simples, responde a tu pregunta: Cada kmalloc necesita un kfree, de lo contrario, la memoria permanecerá allí mientras el sistema esté activo.

Cuestiones relacionadas