Crea tus propios Drivers o Modulos Linux

En este artículo voy a describir el principio de un driver para Linux, a los cuales se les conoce como módulos.

Al momento de escribir esto, contaba con un kernel de la serie 2.6.9 pero igual debería funcionar en otras versiones del kernel.

1) Requieres contar con el fuente de tu kernel, al momento de compilar
2) Tener make y GNU C instalado

* Yo me encuentro usando los que vienen por default en RedHat AS 4.0

Mi intención original era crear un driver del tipo C “Carácter?, el cual seria una simple variable para almacenar en RAM, pero por el momento solo será un modulo flotante en la memoria del sistema

El código de memoria.c

#include

MODULE_AUTHOR ("Last Dragon 2006");
MODULE_LICENSE ("GPL");

int cuenta (int n)
{
while (n++ < 5) printk ("he contado %d veces\n",n); return n; } int init_module(void) { printk("<1> Instalando Driver en el Kernel\n");
cuenta(0);

return 0;
}
void cleanup_module(void)
{
printk("<1> Retirando el Driver del Kernel\n");

}

Explicación, Cada que un driver en Linux arranca se llama a una función especifica que debería existir en todo modulo, la entera init_module y cuando un modulo es retirado igual mente se busca cleanup_module

Básicamente usamos la init_module para inicializar y preparar el modulo y cleanup_module nos da la oportunidad de retirar todo lo hecho en el modulo, por ejemplo si alguna función se le asigno memoria con kmalloc, debemos liberarla y quitar las instancias a cualquier hardware o dispositivo abierto, por ahora el código es muy simple..

Inicia y manda un aviso a la consola que ha cargado y para que haga “algo? le he mandado a ejecutar una función que contara 5 veces y cada que cuenta mostrara en pantalla la cuenta, y para retirarlo. Igualmente manda un mensaje

Ahora vamos a compilarlo, Nota que no existe la función main, es como crear una librería dinámica, pero esta será una librería dinámica para el kernel, no para una aplicación .

Pasos para compilar

1) Crea un archivo Makefile
2) Escríbele en su interior
3) obj-m:= memoria.o
4) Ejecuta make, asi:
make -C /usr/src/kernels/2.6.9-5.EL-i686 SUBDIRS=/root/holamod modules

El segundo parámetro de Make es una ruta al directorio del kernel, tu debes poner la ubicación de tu kernel, el valor de subdirs es donde esta almacenado el código fuente de tu modulo. Yo estoy trabajando en /root/holamod, tu puedes escribir tu modulo en cualquier otra carpeta.

Si todo ha salido bien, ahora tienes en tu carpeta de desarrollo el archivo memoria.ko, que es el modulo. Ahora solo hay que probarlo

Revisemos la información del modulo, con modinfo

filename: memoria.ko
author: Last Dragon 2006
license: GPL
vermagic: 2.6.9-5.EL 686 REGPARM 4KSTACKS gcc-3.4
depends:

Parte de la información la esta tomando de:
MODULE_AUTHOR (“Last Dragon 2006”);
MODULE_LICENSE (“GPL”);

Citado en el código fuente de nuestro modulo

Montemos el modulo con el programa insmod, debes ser root

[root@linux holamod]# insmod memoria.ko > ins.txt
Instalando Driver en el Kernel
he contado 1 veces
he contado 2 veces
he contado 3 veces
he contado 4 veces
he contado 5 veces

El modulo se ejecuta, como se indica en el código.

Comprobemos que es parte del kernel

Con lsmod

Module Size Used by
memoria 1664 0
smbfs 66233 2
md5 4033 1
floppy 58481 0
ext3 116809 1

Ahora desmontemos nuestro modulo, con rmmod

[root@linux holamod]# rmmod memoria
Retirando el Driver del Kernel

Si has llegado hasta este punto, todo ha ido bien.

One Response

Add a Comment

Comment spam protected by SpamBam