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.