# Módulo de núcleo

En computación, un módulo cargable del núcleo (loadable kernel module, LKM en inglés) es un archivo que contiene código objeto que puede extender el núcleo en ejecución (también llamado núcleo base) de un sistema operativo. La mayoría de los sistemas estilo Unix, y Microsoft Windows, soportan módulos cargables en el núcleo, aunque suelen utilizar distintos nombres para ellos, como "extensión del núcleo" en Mac OS X.
Los módulos cargables en el núcleo son generalmente utilizados para brindar soporte a nuevos dispositivos de hardware y sistema de archivos, así como para agregar llamadas al sistema. Cuando la funcionalidad provista por un módulo del núcleo deja de ser requerida, normalmente este puede ser descargado, liberando su memoria.
Un ejemplo típico de módulo cargable son los controladores de dispositivo.

## Diferencias entre módulos y aplicaciones

Un módulo cargable es diferente de una aplicación en varias formas. Si bien las aplicaciones de tamaño pequeño a mediano suelen realizar una única tarea de comienzo a fin, un módulo cargable únicamente se registra en el núcleo con el fin de servir futuros requerimientos. El estilo de programación de un módulo es similar a la programación dirigida por eventos.
Otra diferencia importante consiste en la tolerancia a fallos. Si bien el hecho de que una aplicación aborte por errores suele ser inofensivo a nivel del sistema operativo, el fallo de un módulo cargado en el núcleo podría dejar a todo el sistema en un estado inconsistente o inutilizable.
Finalmente, los módulos ejecutan en espacio de núcleo, mientras que las aplicaciones ejecutan en espacio de usuario.

## Módulos y controladores de dispositivos

Un típico empleo para los módulos cargables en el caso de Linux es crear controladores de dispositivos de hardware.
Los controladores de dispositivos tienen un rol especial en el núcleo Linux. Estos son los encargados de esconder completamente los detalles de cómo un dispositivo funciona internamente a nivel del hardware, permitiendo que las actividades de los usuarios sean realizadas mediante un conjunto de llamadas estándar, independientes del controlador específico que se está utilizando en realidad.
La ventaja de desarrollar controladores de dispositivos para Linux consiste en que estos pueden desarrollarse por separado del resto del núcleo y luego ser cargados en tiempo de ejecución, cuando se necesite de ellos. Esta modularidad hace que escribir controladores de dispositivos para Linux sea una tarea sencilla.

## Ventajas del uso de módulos

Un sistema operativo que no dispone de módulos cargables en el núcleo debe tener toda aquella funcionalidad que pueda llegar a ser necesitada precompilada dentro del núcleo base. El problema de este enfoque consiste en que en general la imagen del núcleo sería mucho mayor, ocupando un gran espacio memoria. Así mismo, resultaría necesario que los usuarios recompilaran y reiniciaran el núcleo base cada vez que se necesite agregar nueva funcionalidad al mismo.

## Cuestiones de licenciamiento
### Linux

El núcleo Linux es un proyecto de código abierto licenciado bajo la versión 2 de la licencia GNU GPL. Debido a las características de esta licencia, los fabricantes de hardware suelen dudar si es posible distribuir controladores de dispositivos privativos.
En la opinión de quienes realizan el mantenimiento de Linux, los módulos cargables son un trabajo derivado del núcleo, no obstante, la legalidad de la distribución en forma únicamente binaria de módulos se ha mantenido deliberadamente ambigua. Se considera que el caso de la interacción entre módulos privativos y el núcleo en sí mismo se encuentra en una zona indefinida de la licencia GPL.
Suele decirse que la carga de módulos privativos "mancha" el núcleo, refiriéndose a que será poco probable que cualquier problema o error experimentado sea investigado por quienes realizan su mantenimiento. Esto se debe a que al cargar un módulo, este se vuelve parte del núcleo en ejecución, por lo cual podría corromper las estructuras de datos del mismo y/o introducir errores que no podrían ser investigados debido a la naturaleza privativa del módulo.

## Seguridad

Si bien los módulos cargables consisten en un método conveniente para modificar el núcleo en ejecución, esto podría llegar a ser abusado por un atacante en un sistema comprometido, con el fin de prevenir la detección de procesos o archivos maliciosos, permitiéndole mantener control sobre el sistema o robar información privada.
En el caso de Linux, la mayoría de los controles de seguridad del sistema se refuerzan a través del núcleo. Si este tiene problemas de seguridad, el sistema completo será vulnerable. En la distribución oficial del núcleo, solo un usuario autorizado, conocido como el superusuario, puede cargar módulos.
A su vez, los desarrolladores de módulos cargables deberían ser cuidadosos de no introducir errores de seguridad en los módulos que desarrollan. El lenguaje de programación C, utilizado en la mayoría de Linux, hace que el introducir errores sea fácil y muchos problemas de seguridad suelen deberse a que los desarrolladores olvidan controlar cuánta información es almacenada en una porción asignada de memoria (buffer), derivando en errores de sobreescritura de memoria que podrían ser utilizados por un usuario malicioso para alterar la memoria del núcleo y sus módulos.