Introducción
Autor
- Linux Kernel Module Programming Guide fue escrita originalmente por Ori Pomerantz para Linux v2.2
- Peter Jay Salzman la actualizó para Linux v2.4
- Michael Burian la co-mantuvo para Linux v2.6
- Bob Mottram actualizó los ejemplos para versiones posteriores a Linux v3.8
- Jim Huang la actualizó para versiones recientes de Linux (v5.0 o superiores) y corrigió la documentación en LaTeX
Agradecimientos
- Varios colaboradores aportaron correcciones y sugerencias
¿Qué es un módulo del kernel?
- Un módulo del kernel de Linux es un segmento de código que puede cargarse y descargarse dinámicamente en el kernel según sea necesario
- Los módulos del kernel amplían la funcionalidad del kernel sin reiniciar el sistema
- Sin módulos, habría que recompilar el kernel y reiniciar el sistema cada vez que se agregara una nueva función
Paquete de módulos del kernel
- Ubuntu/Debian:
sudo apt-get install build-essential kmod
- Arch Linux:
sudo pacman -S gcc kmod
¿Qué módulos tiene mi kernel?
- Con el comando
lsmod se pueden ver los módulos cargados actualmente en el kernel
- También puede comprobarse en el archivo
/proc/modules
¿Es necesario descargar y compilar el kernel?
- No es necesario descargar ni compilar el kernel para seguir esta guía
- Es más seguro ejecutar los ejemplos en una distribución de prueba
Antes de empezar
- Precauciones sobre control de versiones de módulos, uso de X Window System, SecureBoot, etc.
Headers
- Es necesario instalar los archivos de headers del kernel
- Ubuntu/Debian:
sudo apt-get install kmod linux-headers-$(uname -r)
- Arch Linux:
sudo pacman -S linux-headers
- Fedora:
sudo dnf install kernel-devel kernel-headers
Ejemplos
- Todos los ejemplos están en el subdirectorio
examples del documento
Hello World
El módulo más simple
- Crear y compilar el archivo
hello-1.c
- Explicación de cómo cargar y descargar el módulo
Hello y Goodbye
- Ejemplo de uso de las macros
module_init y module_exit
Macros __init y __exit
- La macro
__init libera memoria cuando la función de inicialización termina
- La macro
__exit omite la función cuando el módulo está integrado en el kernel
Licencia y documentación del módulo
- Usar la macro
MODULE_LICENSE para especificar la licencia del módulo
- Ejemplos de uso de las macros
MODULE_AUTHOR y MODULE_DESCRIPTION
Pasar argumentos de línea de comandos
- Usar la macro
module_param para pasar argumentos de línea de comandos al módulo
- Usar la macro
MODULE_PARM_DESC para agregar una descripción de los argumentos
Módulos distribuidos en varios archivos
- Ejemplo de un módulo del kernel dividido en varios archivos fuente
Compilar módulos para un kernel precompilado
- Explicación de cómo compilar módulos para un kernel precompilado
Resumen de GN⁺
- Esta guía es una referencia integral sobre programación de módulos del kernel de Linux, y cubre desde conceptos básicos hasta temas avanzados con diversos ejemplos
- Los módulos del kernel permiten ampliar la funcionalidad del kernel sin reiniciar el sistema, lo que representa una gran ventaja para los desarrolladores
- Es importante comprender y seguir bien las precauciones relacionadas con control de versiones de módulos, SecureBoot, etc.
- Entre los proyectos relacionados están Linux Device Drivers y The Linux Programming Interface
1 comentarios
Comentarios en Hacker News
qemues una buena forma de experimentar el hacking del kernel