systemadmin.es > Kernel > Programación de un modulo del kernel simple

Programación de un modulo del kernel simple

La programación de un módulo del kernel de Linux no es tan diferente de la programación de cualquier otro software, simplemente los errores se suelen pagar más caros. Vamos a ver el típico Hello World como módulo del kernel:

Primero de todo deberemos incluir algunos headers que contienen definiciones que vamos a necesitar:

#include <linux/init.h>
#include <linux/module.h>

A continuación deberemos definir la licencia del modulo:

MODULE_LICENSE("GPL");

Si nos la inventamos simplemente nos avisara al hacer el insmod:

helloworld: module license 'xGPL' taints kernel.

A continuación deberemos definir las funciones de inicialización i destrucción del modulo en las cuales para este sencillo ejemplo haremos un simple printk (equivalente de printf en el kernel):

static int hello_world_init(void)
{
        printk(KERN_ALERT "Hello World!\n");
        return 0;
}

En la función de destrucción haremos lo mismo:

static void hello_world_exit(void)
{
        printk(KERN_ALERT "Bye World!\n");
}

Finalmente deberemos indicar como hemos llamado a las funciones mediante module_init y module exit:

module_init(hello_world_init);
module_exit(hello_world_exit);

Finalmente deberemos crear el fichero de Makefile:

obj-m += helloworld.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Es obligatorio que antes de los comandos “make” haya un tabulador y no un conjunto de espacios, sino no va a reconocer el formato del Makefile.

Con el comando make vamos a compilar el modulo del kernel:

# make
make -C /lib/modules/2.6.18-53.1.21.el5PAE/build M=/home/jordi/helloworld modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.1.21.el5-PAE-i686'
  CC [M]  /home/jordi/helloworld/helloworld.o
  Building modules, stage 2.
  MODPOST
  CC      /home/jordi/helloworld/helloworld.mod.o
  LD [M]  /home/jordi/helloworld/helloworld.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.1.21.el5-PAE-i686'

Mediante un ls podemos ver los ficheros que ha generado:

# ls
helloworld.c  helloworld.ko  helloworld.mod.c  helloworld.mod.o  helloworld.o  Makefile  Module.symvers

Podemos cargar el módulo mediante insmod:

insmod helloworld.ko

A continuación mediante el dmesg podremos ver el Hello World:

audit(1254211500.001:3472101): user pid=1772 uid=0 auid=0 msg='insmod helloworld.ko '
Hello World!

Una forma de ver que el módulo esta cargado es mediante lsmod:

# lsmod  | grep hel
helloworld              5504  0

Para ver el “Bye World” lo descargamos mediante rmmod:

rmmod helloworld

Y de nuevo, con dmesg, podremos ver el mensaje de despedida:

audit(1254211613.892:3472132): user pid=1772 uid=0 auid=0 msg='rmmod helloworld'
Bye World!
audit(1254211627.421:3472133): user pid=1772 uid=0 auid=0 msg='dmesg '

2 comments to “Programación de un modulo del kernel simple”

  1. Hola!

    Yo soy estudiante de Ciencias de la Computación, me confieso adicto a Linux. Pero quiero dejar de ser un simple usuario que usa la terminal para instalar o modificar su kernel para mejorar el rendimiento de su pc. QUIERO APORTAR COSAS A LA COMUNIDAD DEL KERNEL. Tu publicación es interesante. Estaría muy agradecido si podrías ayudarme diciéndome

    ¿En qué ayudaría, la programación de modulos para el kernel?? ¿Mejora de control del Hardware, para eso no usaría el lenguaje ensamblador? o no sé. Agradezco tu ayuda.

  2. Gracias che!
    Estoy hace unas horas con este tema, y no me quedaba claro, y con tu explicación me quedo super clarisimo.
    Saludos desde La Plata, Argentina.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>