linux-kernel
Controlador del dispositivo Linux Hello World
Buscar..
Un módulo vacío del núcleo
#include <linux/init.h>
#include <linux/module.h>
/**
* This function is called when the module is first loaded.
*/
static int __init hello_kernel_init(void)
{
printk("Hello, World!\n");
return 0;
}
/**
* This function is called when is called if and when the module is unloaded.
*/
static void __exit hello_kernel_exit(void)
{
printk("Goodbye, cruel world...\n");
}
/* The names of the init/exit functions are arbitrary, and they are bound using the following macro definitions */
module_init(hello_kernel_init);
module_exit(hello_kernel_exit);
Para escribir un controlador de dispositivo Linux (dispositivo de caracteres, dispositivo de bloque, etc.), es necesario crear un módulo de kernel que tenga puntos de entrada y salida.
Por sí mismo, el módulo kernel no hace nada; no tiene una manera significativa de comunicarse con el espacio de usuario. Usando el punto de entrada, es posible crear un nuevo dispositivo de carácter, por ejemplo, que luego se utiliza para comunicarse con el espacio de usuario.
Construyendo y ejecutando el módulo.
Para compilar el controlador, es necesario tener el árbol de origen del kernel de Linux.
Suponiendo que las fuentes están en /lib/modules/<kernel-version>
, el siguiente Makefile compilará el archivo driver.c
en el driver.ko
kernel driver.ko
obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
Observe cómo se make
estas llamadas de Makefile en el directorio de compilación del Kernel.
Cuando el paso de compilación finalice satisfactoriamente, el directorio src del controlador tendrá un aspecto similar al siguiente:
driver.c driver.ko driver.mod.c driver.mod.o driver.o Makefile modules.order Module.symvers
Para "ejecutar" el módulo, es necesario insertar en el kernel en ejecución:
$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!
$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...