En UNIX y Linux se accede a los dispositivos desde el espacio de usuario de idéntica forma a como se hace con un fichero. Dichos ficheros suelen colgar del directorio /dev.
Para ligar ficheros con dispositivos se utilizan dos números: número mayor y número menor. El número mayor es el que utiliza el kernel para relacionar el fichero con su driver. El número menor es para uso interno del dispositivo y por simplicidad no lo veremos aquí.
Para conseguir este propósito primero se tiene que crear el fichero que sirva como dispositivo con el comando, como usuario root,
# mknod /dev/memoria c 60 0
donde la c significa que se trata de un dispositivo tipo char, el 60 es el número mayor y el 0 el número menor. Para ligar un driver con su fichero /dev correspondiente se utiliza la función register_chrdev que tiene como argumento el número mayor del dispositivo. Esta función se llama con tres argumentos: número mayor, cadena de caracteres indicando el nombre del módulo y una estructura file operations que asocia esta llamada con las funciones aplicables a ficheros definidas dentro de ella. Se invoca, al instalar el módulo, de esta forma:
<<memoria init module>>=
int init_module(void) {
int result;
/* Registrando dispositivo */
result = register_chrdev(memoria_major, "memoria",
&memoria_fops);
if (result < 0) {
printk(
"<1>memoria: no puedo obtener numero mayor %d\n",
memoria_major);
return result;
}
/* Reservando memoria para el buffer */
memoria_buffer = kmalloc(1, GFP_KERNEL);
if (!memoria_buffer) {
result = -ENOMEM;
goto fallo;
}
memset(memoria_buffer, 0, 1);
printk("<1>Insertando modulo\n");
return 0;
fallo:
cleanup_module();
return result;
}
|
Además reservamos espacio en memoria para el buffer de nuestro dispositivo, memoria_buffer, a través de la función kmalloc, la cual es muy similar a la común malloc. Finalmente actuamos en consecuencia ante posibles errores al registrar el número mayor o al reservar memoria.