El código binario del núcleo

El código ejecutable del núcleo de Linux (el que se carga en memoria al arrancar el ordenador) reside en un fichero denominado vmlinux (o en su homólogo comprimido, vmlinuz). Normalmente, este fichero se encuentra en el directorio /boot/ y suele tener como sufijo la versión del núcleo que generó el ejecutable (por ejemplo, /boot/vmlinuz-2.4.22-1). Cuando instalamos una distribución de Linux, el fichero binario del núcleo que incorpora la distribución es instalado en ese directorio y el cargador del sistema operativo (habitualmente, LILO o GRUB) lo carga en memoria y le ofrece el control al encender el ordenador. Este fichero binario es por tanto imprescindible para el funcionamiento del sistema. Por otra parte, si instalamos un binario nuevo (de una versión más moderna, por ejemplo), debemos reiniciar el ordenador para que vuelva a ser cargado en memoria. A diferencia de otros sistemas operativos, esta viene a ser la única situación en Linux en la que instalar un nuevo software obliga a reiniciar ("...para que los cambios tengan efecto").

En realidad, el código binario del núcleo puede dividirse entre diferentes ficheros: el fichero binario principal vmlinuz mencionado arriba (que es absolutamente necesario) y, opcionalmente, un conjunto de ficheros denominados módulos de núcleo (kernel modules). Los módulos de núcleo son ficheros objeto (compilados de forma especial) que incorporan funcionalidades concretas que pueden ser instaladas y desinstaladas del núcleo de Linux sin tener que generar un nuevo ejecutable vmlinuz e incluso sin tener que reiniciar el ordenador. Normalmente, la misma funcionalidad puede ser incorporada al núcleo (en fase de compilación) como parte del binario principal o como un módulo de núcleo.

Un buen ejemplo del uso de estos módulos es la instalación de manejadores (drivers) de dispositivos. Suponga que acabamos de instalar una nueva tarjeta de red en nuestro ordenador. Si el manejador de dicha tarjeta no está integrado en el binario principal del núcleo (vmlinuz), pero sí disponemos de él como un módulo de núcleo, podemos simplemente "cargarlo" en el núcleo mediante una orden de shell, sin tener que recompilar el vmlinuz y reiniciar el sistema. Los módulos de núcleo se encuentran disponibles en Linux desde la versión 1.2, y resultan una herramienta muy útil para multitud de situaciones, en especial para poder ofrecer un núcleo con un amplio soporte de manejadores, sistemas de archivos, protocolos de red, etc., sin tener que incluirlos necesariamente en el binario principal.

De hecho, el soporte de módulos está tan bien integrado en el sistema que también resulta transparente para los usuarios en la mayoría de ocasiones. Por ejemplo, si montamos por primera vez una partición de tipo FAT32 en un sistema en el que dicho sistema de archivos está soportado por módulos de núcleo, Linux cargará automáticamente dichos módulos y luego montará la partición en el directorio correspondiente, sin ninguna intervención al respecto del usuario (ni del administrador).

Hoy en día, distribuciones como Fedora incorporan un núcleo con un soporte razonable en el binario principal y un número muy elevado de módulos de núcleo que cubren buena parte del soporte extra que podemos necesitar en el sistema. Sin embargo, existen ocasiones en las que necesitamos conseguir un soporte distinto. A continuación se enumeran algunas de ellas: