Para probar el comportamiento del kernel cuando pierde memoria, estoy escribiendo un módulo kernel que continuamente asigna memoria, p. el código se ve comocómo determinar si un módulo del kernel de Linux tiene una pérdida de memoria
int bytesLeaked = 128000;
char *var = kmalloc(bytesLeaked, GFP_KERNEL);
if (var != NULL)
printk("leaked %d bytes at address %x\n", bytesLeaked, (unsigned int)var);
Este código está en el init_module. Tengo las siguientes preguntas
- ¿Cómo puedo determinar si el código ha filtrado la memoria? lsmod no revela mucho.
- Los tutoriales en Internet solo muestran el código en init_module y exit_module. ¿Qué pasa si deseo hacer la asignación de memoria durante un período de tiempo después de que se haya insertado el módulo pero antes de salir?
- ¿Es posible para mí escribir código que gotea la memoria solo cuando el usuario le da una instrucción para que lo haga, p. ¿Puede un programa de espacio de usuario hacer una llamada al sistema que hará que el módulo pierda memoria?
re 1: La propiedad de definición de una pérdida de memoria es que la asignación nunca se libera, no necesariamente que no hay referencias a la misma. Además, 'var' presumiblemente está fuera de alcance en algún momento, momento en el que su recuento de referencias va a 0 de todos modos. (Vamos a ignorar el hecho de que "referencia" no está bien definido en el lenguaje C.) – Karmastan
Gracias. Traté de codificar para generar hilos, pero el código es bastante complejo http://www.scs.ch/~frey/linux/kernelthreads.html. ¿Serás capaz de proporcionar una idea de cómo puedo activar la asignación de memoria a través de un evento de espacio de usuario sin una llamada al sistema? – kakinada
KEDR es compatible con las versiones 2.6.31 o posteriores del kernel. El mío es 2.6.28. Parece que KEDR no se puede usar. Trataré de encontrar herramientas similares para el kernel que tengo – kakinada