Programación de un modulo del kernel simple

 

Copy&Page: http://systemadmin.es/2009/09/programacion-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 

Related posts:

  1. Cookbook Libros de Programación   He encontrado que en SAFARI están todos los lirbos...

Related posts brought to you by Yet Another Related Posts Plugin.


About this entry