Normalmente cuando se carga un módulo de un driver de un dispositivo en el kernel se suelen realizar una serie de tareas preliminares como reiniciar el dispositivo, reservar RAM, reservar interrupciones, reservar los puertos de entrada/salida del dispositivo, etc.
Para ello existen dos funciones, init_module y cleanup_module, dentro del espacio de kernel correspondientes a las del espacio de usuario, insmod y rmmod, que se utilizan cuando se instala o quita un módulo. Dichas funciones son llamadas por el kernel cuando se realizan estas operaciones.
Veamos un ejemplo práctico con el clásico programa “Hola mundo”:
<<hola.c>>= #define MODULE #include <linux/module.h> int init_module(void) { printk("<1>Hola mundo\n"); return 0; } void cleanup_module(void) { printk("<1>Adios mundo cruel\n"); } |
También se ha introducido la función printk, la cual es muy similar a la conocida printf sólo que opera dentro del kernel. El símbolo <1> indica la prioridad del mensaje, se ha especificado una alta prioridad (bajo número) para que el mensaje aparezca por pantalla y no se quede en los ficheros de mensajes del kernel.
Cuando se cargue y descargue el módulo aparecerán en la consola los mensajes que hemos escrito dentro de printk. Si no los vemos inmediatamente en la consola podemos escribir el comando dmesg en la línea de comandos para verlos o mostrando el fichero de mensajes del sistema con cat /var/log/syslog.
En la Tabla 4 se pueden ver estas dos nuevas funciones.
Eventos | Funciones de usuarios | Funciones del kernel |
Carga de módulo | insmod | init_module |
Abrir dispositivo | ||
Leer dispositivo | ||
Escribir dispositivo | ||
Cerrar dispositivo | ||
Quitar módulo | rmmod | cleanup_module |
Tabla 4. Eventos de los drivers y sus funciones asociadas de intercambio entre el espacio de kernel y el espacio de usuario.