Pregunta

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 falló sin cerrar el archivo.

¿Habría algo que hubiera liberado este recuerdo?

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

¿Se perderá esta memoria en el sistema hasta que reinicie o se liberará cuando descargue el controlador?

¿Fue útil?

Solución

La memoria del kernel 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 un proceso sale, por cualquier motivo (incluido kill -9), se cierran todos los descriptores de archivos abiertos y se llama a la función de cierre del controlador.Entonces, si libera allí, nada de lo que pueda hacer el proceso hará que la memoria permanezca después de que el proceso muera.

Otros consejos

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

¿Qué quiero decir con esto?

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

Técnicamente, cuando cargas un módulo y luego llamas a kmalloc, lo que hiciste fue pedirle al kernel que te asignara algo de memoria en el espacio del kernel, técnicamente es una nueva memoria para todo el kernel, por lo que incluso si descargas tu módulo, eso La memoria del kernel asignada está ahí a menos que se libere explícitamente.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top