Módulos Contenido • • • • Kernel y módulos Módulos Anatomía de un módulo Programación de un módulo Kernel y módulos En un sistema Linux la interacción final con dispositivos la realizan los controladores o el Kernel. Dicho de otra forma, un dispositivo sólo podrá ser usado si el Kernel lo soporta o si existe un controlador capaz de controlarlo y si se configura apropiadamente para hacerlo. Por esto, los dispositivos que se produzcan hoy, no pueden ser operados con controladores ya existentes (a menos que los dispositivos hayan sido diseñados para ser operados con estos ---caso que para algunos dispositivos como tarjetas de sonido, tarjetas de video o módems es poco común), por esto mismo, eventualmente, si actualiza el hardware de su computador o si desea usar un cierto servicio del Kernel, también deberá actualizar algún módulo o eventualmente el Kernel completo. Aunque algunos controladores auto detectan la configuración del dispositivo, esto no siempre ocurre y en algunos casos tendrá que probar, hasta hacer funcionar el módulo que maneja el dispositivo. Las fuentes en C de cada versión del Kernel cuentan con controladores para diversos dispositivos. Cuando se compila una versión, algunos de esos controladores pueden unirse con el Kernel mismo (estáticamente), otros pueden dejarse como módulos para cargarse/descargarse cuando la parte estática del Kernel este operando, otros pueden ser excluidos del proceso de compilación (y por lo tanto no podrán ser usados ni cuando el Kernel esté operando). Módulos En este contexto, módulo se refiere a un controlador de un dispositivo o servicio que puede cargarse o descargarse cuando el usuario o algún dispositivo lo solicitan (dinámicamente). Los módulos que se distribuyen con en el Kernel están ubicados en el directorio /lib/modules/<versión>, donde <versión> es la versión de su Kernel, con la extensión “.o” organizados en directorios que indican el tipo de dispositivo o el propósito, por ejemplo: “fs” sistema de archivos, “net” protocolos y hardware para redes. Para lograr configurar un dispositivo controlado por un módulo, puede emplear las herramientas del paquete modutils o modconf para: 1. Asegurar que no haya conflictos entre el dispositivo con otros y eventualmente conocer la configuración que usa (algunos controladores auto detectan la configuración del dispositivo, pero no todos). 2. Encontrar un módulo que pueda manejar el dispositivo. 3. Eventualmente pasar opciones al módulo de acuerdo a la configuración del dispositivo (IRQ o dirección base). En algunas distribuciones de Linux las herramientas del paquete modutils se configuran en los archivos del directorio /etc/modutils (con la información de esos archivos y de /etc/modules se genera el archivo de configuración de módulos /etc/modules.conf). Los programas que ese paquete incluye son: lsmod Lista los módulos cargados, de cada uno presenta nombre, tamaño, cuenta de usos y lista de módulos que lo usan (es equivalente a cat /proc/modules). rmmod módulos Descarga uno o más módulos cargados, mientras estos no estén siendo usados. Con la opción -r intenta descargar recursivamente módulos de los cuales el módulo especificado dependa. El comando rmmod -a descarga todos los módulos que no estén siendo usados. insmod módulo [opciones] Trata de cargar el módulo especificado. Pueden pasarse opciones específicas para el módulo, a continuación del nombre con la sintaxis símbolo=valor (los símbolos posibles dependen del módulo, pueden verse algunos en estas guías o en /usr/share/modconf/descr.gz --- que es la ayuda presentada por modconf --- o en último caso en las fuentes del módulo en los macros MODULE_PARAM y MODULE_PARAM_DESCR). Puede indicarse una ruta no estándar para buscar módulos estableciéndola en la variable MODPATH o en /etc/modules.conf. Dado que los módulos se enlazan directamente con el Kernel, deben ser compilados para una versión precisa, con la opción -f puede evitarse el chequeo de versiones. depmod Como un módulo puede requerir otros, hay dependencias que deben respetarse al cargar y descargar módulos. depmod permite calcular tales dependencias entre varios módulos o entre todos los disponibles con la opción -a. Por defecto depmod -a escribe las dependencias en el archivo /lib/modules/version/modules.emp, cada línea de ese archivo tiene el nombre de un módulo seguido del caracter ':' y los módulos de los cuales depende, separados por espacios. modprobe módulo opciones Emplea la información de dependencias generada por depmod e información de /etc/modules.conf para cargar el módulo especificado, cargando antes todos los módulos de los cuales dependa. Para especificar el módulo basta escribir el nombre (sin la ruta, ni la extensión .o) o uno de los alias definidos en /etc/modutils/alias (o en otro archivo del directorio /etc/modutils). Si hay líneas pre-install o post-install en /etc/modules.conf, modprobe puede ejecutar un comando antes y/o después de cargar el módulo. Como opciones para cargar el módulo usa prioritariamente las dadas en la línea de comandos y después las especificadas en líneas de la forma options módulo opciones en el archivo /etc/modules.conf. Puede emplear estos programas para configurar sus módulos y puede hacer permanentes los cambios, agregando el módulo y las opciones en el archivo /etc/modules. Anatomía de un módulo Para esta sección leer el artículo “Anatomy of Linux loadable kernel modules”, el cual se encuentra en: • http://www.ibm.com/developerworks/linux/library/l-lkm/index.html? ca=dgr-lnxw07LinuxLKM&S_TACT=105AGX59&S_CMP=GR Programación de un módulo Para esta sección leer la guía “The Linux Kernel Module Programming Guide”, esta guía se encuentra en: • Versión en inglés: http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html • Versión en español: http://www.wikilearning.com/tutorial/guia_de_programacion_de_modulos _del_nucleo_linux-sobre_este_tutorial/9762-1