Si desea agregar código a un kit de Linux, la forma básica de hacerlo es agregar archivos fuente al árbol de fuentes del kernel y ensamblar el kernel. De hecho, el proceso de configuración del kernel consiste principalmente en seleccionar qué archivos se van a cargar en el kernel. Pero también puede agregar código al kit de Linux mientras se está ejecutando. Un fragmento de código que agrega de esta manera se denomina módulo de kernel cargable (LKM) . Estos módulos pueden hacer muchas cosas, pero generalmente son uno de tres elementos:
- controladores de dispositivo
- controladores del sistema de archivos
- llamadas del sistema.
El kernel separa ciertas funciones, incluidas estas, especialmente bien, por lo que no es necesario cifrarlas en todo el kernel. Varios parámetros que un conductor debe conocer pueden cambiar de sistema a sistema. Estos pueden variar desde el número de dispositivo a usar hasta numerosos aspectos de cómo debe operar el controlador.
Terminología
Los módulos del kernel descargables a menudo se denominan módulos del kernel o simplemente módulos, pero son engañosos porque hay tantos tipos de módulos en el mundo con diferentes piezas integradas en el kernel base que fácilmente pueden llamarse módulos. Usamos el término módulo kernel o LKM para ciertos tipos de módulos. Algunas personas piensan que LKM está fuera del kernel. Hablan de LKM que se conectan al kernel. Esto es un error; LKM (si está cargado) es una gran parte del kernel. El término correcto para una parte del kernel vinculada a la imagen que está lanzando es » kernel base «. LKM se conecta al kernel base. En algunos sistemas operativos, el equivalente a Linux LKM se denomina «extensión del kernel».
Historia de LKM
Los módulos del kernel cargables no estaban en Linux al principio. Todo lo que usamos para LKM hoy está integrado en el kernel base en el momento de construir el kernel. Los LKM existen al menos desde Linux 1.2 (1995). Sin embargo, los controladores de dispositivos, etc., siempre fueron modulares. Cuando se establecieron LKM, se requirió una pequeña cantidad de trabajo en estos módulos para formar LKM. Sin embargo, tenía que hacerse individualmente, por lo que tomó tiempo. Desde aproximadamente el año 2000, casi todo lo que es tan sensato como LKM ha tenido al menos la opción de ser LKM.
El caso de LKM
A menudo tiene la opción de instalar un módulo en un kernel cargándolo como LKM o comprometiéndose con él. núcleo base. LKM tiene muchos beneficios además de vincularse al núcleo básico. Otra ventaja es que no necesita reconstruir su kernel con frecuencia. Esto ahorra tiempo y le ahorra a usted. Es posible que haya cometido un error al reestructurar y refinar el kernel base. Una vez que tenga un kernel de base de trabajo, es mejor dejarlo intacto durante el mayor tiempo posible. Otra ventaja es que LKM lo ayuda a diagnosticar problemas del sistema. La interrupción del controlador del dispositivo en el kernel puede detener la ejecución de su sistema. Y puede ser muy difícil decir qué parte del núcleo base creó un problema. Sin embargo, si el controlador del mismo dispositivo LKM, el kernel base vuelve a estar activo antes de que se cargue el controlador del dispositivo.
Los LKM pueden ahorrarle memoria porque solo debe descargarlos si realmente los usa. Todas las partes del kernel base se cargan en todo momento, en almacenamiento real, no en almacenamiento virtual. Los LKM son muy rápidos de mantener y reparar. Lo que puede requerir un reinicio completo con el controlador del sistema de archivos integrado en el kernel, puede hacerlo con algunos comandos rápidos con LKM. Puede probar diferentes parámetros o cambiar el código repetidamente en rápida sucesión, sin esperar el arranque. Por cierto, los LKM hacen menos que los módulos básicos del kernel. Llamar a cualquier lugar es solo una rama en el lugar de la memoria donde reside. A veces tienes que construir algo en el kernel base en lugar de hacerlo LKM. Cualquier cosa que exista y que sea necesaria para mover el sistema lo suficiente como para cargar LKM obviamente debe integrarse en el kernel base.
¿Para qué se utilizan los LKM?
Veamos los principales 6 LKM utilizados.
- Controladores de dispositivo: el controlador de dispositivo está diseñado para una pieza específica de hardware. El kernel lo usa para contactar esa pieza de hardware sin conocer los detalles del hardware en el que funciona. Por ejemplo, hay un controlador de dispositivo de unidad de disco ATA. Hay uno para las tarjetas Ethernet compatibles con NE2000. Para utilizar cualquier dispositivo, el núcleo debe contener un controlador para su dispositivo.
- Controladores del sistema de archivos: el controlador del sistema de archivos interpreta el contenido del sistema de archivos, como archivos, referencias y más. Hay muchas maneras de guardar archivos y referencias. Por supuesto, necesita un controlador de sistema de archivos. Por ejemplo, hay un controlador de sistema de archivos de tipo de archivo ext2 que se usa en casi todo el mundo en unidades de disco Linux. También hay un sistema de archivos MS-DOS, así como un NFS.
- Llamadas al sistema: las aplicaciones del espacio de usuario utilizan llamadas al sistema para acceder a los recursos del núcleo. Por ejemplo, hay llamadas al sistema para leer el archivo, crear un nuevo proceso y cerrar el programa. La mayoría de los teléfonos del sistema son parte del sistema y son de última generación, por lo que siempre están integrados en el kernel base (sin opción LKM). Pero puede configurar su teléfono del sistema e instalarlo como LKM. O puede decidir que no le gusta la forma en que Linux hace algo y emitir una llamada al sistema existente con su LKM.
- Controladores de red : el operador de red interpreta el protocolo de red. Alimenta y consume flujos de datos en varias etapas de la actividad de comunicación del kernel. Por ejemplo, si desea un enlace IPX a su propia red, utilizará un controlador IPX.
- Instrucciones de línea TTY : en realidad se trata de una actualización de los controladores de dispositivos para dispositivos de almacenamiento.
- Intérpretes útiles: Cargas de traductores utilizables y usos utilizables. Linux está diseñado para que pueda usarse en una variedad de formatos, y cada uno debe tener su propio traductor utilizable.
Compilación de módulos del núcleo
El siguiente ejemplo muestra cómo nuestro módulo kernel obtiene parámetros de los usuarios en el momento de la carga mediante el comando insmod o modprobe .
Código de ejemplo:
C++
#include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> static char* whoisthis = "Mommy"; static int countpeople = 1; module_param(countpeople, int, S_IRUGO); module_param(whoisthis, charp, S_IRUGO); static int __init m_init(void) { pr_debug("parameters test module is loaded\n"); for (int i = 0; i < countpeople; ++i) { pr_info("#%d Hello, %s\n", i, whoisthis); } return 0; } static void __exit m_exit(void) { pr_debug("parameters test module is unloaded\n"); } module_init(m_init); module_exit(m_exit); M ODULE_LICENSE("GPL");
Caparazón :
Construya el módulo. Para construir este módulo, ejecute:
bash make KERNELDIR=/ruta/hacia/kernel/fuente/dir
Si ya configuró y exportó la variable de entorno `KERNELDIR`, basta con ejecutar ` make` .
uso:
Copie el archivo de objeto **hello_world.ko** en la máquina de destino, luego ejecute:
bash insmod module_parameters.ko
Ejecutando `dmesg | tail -10`, puedes encontrar algo como esto:
[ 1223.506799] Módulo de prueba de parámetros cargado [ 1223.509953] #0 Hola mami
Es correcto que, por defecto, configuremos imprimir **hola, mami** solo una vez. A continuación, descargamos este módulo y le pasamos parámetros al cargarlo.
bash # Descargar usando el comando rmmod rmmod module_parameters # Recargar el módulo y pasar parámetros a itre-cargar el módulo y pasarle parámetros insmod module_parameters.ko whoisthis=dady countpeople=3
Esta vez, el mensaje está cambiado:
[ 1322.364784] parameters test module is loaded [ 1322.366768] #0 Hello, dady [ 1322.367999] #1 Hello, dady [ 1322.369154] #2 Hello, dady