La función en el espacio de kernel correspondiente a la apertura de un fichero en el espacio de usuario (fopen) es el miembro open: de la estructura file operations en la llamada a register_chrdev. En este caso se trata de memoria_open. Tiene como argumentos una estructura inode que pasa información del kernel al driver tal como el número mayor y el número menor y una estructura file con información relativa a las distintas operaciones que se pueden realizar con el fichero. Ninguna de estas dos funciones las veremos en profundidad aquí.
El kernel lleva un contador de cuantas veces está siendo utilizado un driver. El valor para cada driver se puede ver en la última columna numérica del comando lsmod. Cuando se abre un dispositivo para leer o escribir en él, la cuenta de uso se debe incrementar, tal y como aparece en la función memoria_open.
Además de esta operación, en la apertura de un fichero, se suelen iniciar las variables pertinentes al driver y el propio dispositivo en si. En este ejemplo, y debido a su extrema sencillez, no realizaremos operaciones de este tipo en dicha función.
Podemos ver la función memoria_open a continuación:
<<memoria open>>= int memoria_open(struct inode *inode, struct file *filp) { /* Aumentamos la cuenta de uso */ MOD_INC_USE_COUNT; /* Exito */ return 0; } |
En la Tabla 5 se puede ver esta nueva función.
Eventos | Funciones de usuarios | Funciones del kernel |
Carga de módulo | insmod | init_module |
Abrir dispositivo | fopen | file operations: open |
Leer dispositivo | ||
Escribir dispositivo | ||
Cerrar dispositivo | ||
Quitar módulo | rmmod | cleanup_module |
Tabla 5. Eventos de los drivers y sus funciones asociadas de intercambio entre el espacio de kernel y el espacio de usuario.