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:
Núcleo más pequeño. Algunos sistemas necesitan ejecutarse con poca memoria principal. Puesto que el binario principal del núcleo nunca se desaloja de memoria, en ocasiones necesitamos eliminar de dicho binario código que nuestro sistema no necesita y así conseguir más memoria para los procesos de usuario.
Núcleo más seguro. Otra razón para eliminar código del núcleo que no necesitamos es incrementar su robustez y seguridad. Mantener más código (que no se usa) eleva la probabilidad de que nuestro sistema presente vulnerabilidades ante ataques que comprometan la seguridad del mismo.
Núcleo más rápido. Un núcleo completamente "monolítico" (sólo el binario principal y sin módulos de núcleo) es más rápido que otro que tenga su soporte repartido entre ambos. En instalaciones en las que el hardware es lento o la velocidad del núcleo es crítica, es recomendable conseguir un núcleo monolítico (y optimizado). De esta forma conseguimos un núcleo altamente especializado, que probablemente sólo funcionará bien en el ordenador para el que ha sido compilado (u otros con idéntico hardware).
Núcleo más portable. El caso contrario al anterior es conseguir un núcleo que funcione correctamente en el mayor número posible de ordenadores. Esto se consigue mediante un binario principal mínimo y el máximo número posible de módulos de núcleo.