El driver completo “memoria”: parte inicial del driver

Ahora realizaremos un driver completo, memoria.c, utilizando la memoria del ordenador que nos permitirá escribir y leer un carácter en memoria. Este dispositivo, aunque no muy útil, es muy ilustrativo dado que es un driver completo y fácil de implementar ya que no se necesita un dispositivo real.

Para realizar un driver, en la parte inicial de él, tendremos que definir las constantes MODULE y __KERNEL__. Además tendremos que incluir, con #include, una serie de ficheros habituales en los drivers:

  <<memoria inicio>>=

/* Definiciones e includes necesarios para los drivers */
#define MODULE 
#define __KERNEL__ 
#include <linux/config.h> 
#include <linux/module.h>
#include <linux/kernel.h> /* printk() */ 
#include <linux/malloc.h> /* kmalloc() */ 
#include <linux/fs.h> /* everything... */ 
#include <linux/errno.h> /* error codes */ 
#include <linux/types.h> /* size_t */ 
#include <linux/proc_fs.h> 
#include <linux/fcntl.h> /* O_ACCMODE */ 
#include <asm/system.h> /* cli(), *_flags */ 
#include <asm/uaccess.h> /* copy_from/to_user */ 

/* Declaracion de funciones de memoria.c */
int memoria_open(struct inode *inode, struct file *filp); 
int memoria_release(struct inode *inode, struct file *filp); 
ssize_t memoria_read(struct file *filp, char *buf, 
  size_t count, loff_t *f_pos); 
ssize_t memoria_write(struct file *filp, char *buf, 
  size_t count, loff_t *f_pos); 
void cleanup_module(void);

/* Estructura que declara las funciones tipicas */
/* de acceso a ficheros */
struct file_operations memoria_fops = { 
  read: memoria_read,
  write: memoria_write,
  open: memoria_open,
  release: memoria_release 
}; 

/* Variables globales del driver */
/* Numero mayor */
int memoria_major = 60; 
/* Buffer donde guardar los datos */
char *memoria_buffer;


Detrás de los ficheros #include, aparecen las declaraciones de las funciones que definiremos en el programa más adelante. Posteriormente aparece la definición de la estructura file_operations que define las funciones típicas que se utilizan al manipular ficheros y que veremos después. Finalmente están las variables globales del driver, una de ellas es el número mayor del dispositivo y la otra un puntero a la región de memoria, memoria_buffer, que utilizaremos como almacén de datos del driver.