¿Qué son los módulos del kernel?
Los módulos del kernel son fragmentos de código que se pueden cargar y descargar del kernel a pedido.
Los módulos del kernel ofrecen una manera fácil de ampliar la funcionalidad del kernel base sin tener que reconstruir o recompilar el kernel nuevamente. La mayoría de los controladores se implementan como módulos del kernel de Linux. Cuando esos controladores no son necesarios, podemos descargar solo ese controlador específico, lo que reducirá el tamaño de la imagen del kernel.
Los módulos del núcleo tendrán una extensión .ko. En un sistema Linux normal, los módulos del kernel residirán dentro del directorio /lib/modules/
Anteriormente discutimos cómo compilar un kernel desde el código fuente.
Este tutorial explica cómo escribir un módulo Kernel utilizando un ejemplo simple de Hello World.
Yo. Utilidades para Manipular Módulos del Kernel
1. lsmod:lista de módulos que ya se han cargado
El comando lsmod enumerará los módulos que ya están cargados en el núcleo, como se muestra a continuación.
# lsmod Module Size Used by ppp_deflate 12806 0 zlib_deflate 26445 1 ppp_deflate bsd_comp 12785 0 ..
2. insmod – Insertar Módulo en el Kernel
El comando insmod insertará un nuevo módulo en el kernel como se muestra a continuación.
# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko # lsmod | grep "squash" squashfs 35834 0
3. modinfo – Mostrar información del módulo
El comando modinfo mostrará información sobre un módulo del kernel como se muestra a continuación.
# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko filename: /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko license: GPL author: Phillip Lougher description: squashfs 4.0, a compressed read-only filesystem srcversion: 89B46A0667BD5F2494C4C72 depends: intree: Y vermagic: 3.5.0-19-generic SMP mod_unload modversions 686
4. rmmod – Eliminar módulo del kernel
El comando rmmod eliminará un módulo del kernel. No puede eliminar un módulo que ya está en uso por cualquier programa.
# rmmod squashfs.ko
5. modprobe – Agregar o quitar módulos del kernel
modprobe es un comando inteligente que cargará/descargará módulos en función de la dependencia entre módulos. Consulte los comandos de modprobe para obtener ejemplos más detallados.
II. Escribir un módulo kernel Hello World simple
1. Instalando los encabezados de Linux
Debe instalar linux-headers-.. primero como se muestra a continuación. Según su distribución, use apt-get o yum.
# apt-get install build-essential linux-headers-$(uname -r)
2. Código fuente del módulo Hello World
A continuación, cree el siguiente módulo hello.c en el lenguaje de programación C.
#include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <linux/init.h> // included for __init and __exit macros MODULE_LICENSE("GPL"); MODULE_AUTHOR("Lakshmanan"); MODULE_DESCRIPTION("A Simple Hello World module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; // Non-zero return means that the module couldn't be loaded. } static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module.\n"); } module_init(hello_init); module_exit(hello_cleanup);
Advertencia: Todos los módulos del kernel operarán en el espacio del kernel, un modo altamente privilegiado. Así que tenga cuidado con lo que escribe en un módulo del kernel.
3. Crear Makefile para compilar el módulo del kernel
El siguiente archivo MAKE se puede usar para compilar el módulo básico del kernel hello world anterior.
obj-m += hello.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
Use el comando make para compilar el módulo del kernel hello world como se muestra a continuación.
# make make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic' CC [M] /home/lakshmanan/a/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/lakshmanan/a/hello.mod.o LD [M] /home/lakshmanan/a/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'
Lo anterior creará el archivo hello.ko, que es nuestro módulo Kernel de muestra.
4. Insertar o quitar el módulo del kernel de muestra
Ahora que tenemos nuestro archivo hello.ko, podemos insertar este módulo en el kernel usando el comando insmod como se muestra a continuación.
# insmod hello.ko # dmesg | tail -1 [ 8394.731865] Hello world! # rmmod hello.ko # dmesg | tail -1 [ 8707.989819] Cleaning up module.
Cuando se inserta un módulo en el kernel, se invocará la macro module_init, que llamará a la función hello_init. De manera similar, cuando se elimina el módulo con rmmod, se invocará la macro module_exit, que llamará a hello_exit. Usando el comando dmesg, podemos ver el resultado del módulo Kernel de muestra.
Tenga en cuenta que printk es una función que se define en el kernel y se comporta de manera similar a printf en la biblioteca IO. Recuerde que no puede usar ninguna de las funciones de la biblioteca del módulo del kernel.
Ahora ha aprendido los conceptos básicos para crear su propio módulo Linux Kernel.