El driver “memoria”: conexión de dispositivos con sus ficheros

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.