El kernel es un programa o conjunto de éstos que se encarga de tareas básicas para el funcionamiento del sistema y los programas que aloja. Provee la entrada y salida de datos(I/O), la gestión de memoria, la gestión del planificador del procesador y la gestión de dispositivos. Todo esto se realiza en una zona de memoria que se llama la zona kernel, con sus características y privilegios diferentes de la zona usuario que es donde corren los programas que usamos. Si tenemos un kernel lento, nuestro sistema también lo será por eso es necesario optimizarlo compilándolo para nuestra arquitectura y sobre todo, mantenerlo pequeño. Esto es tan importante que los programas que corren en la zona kernel no utilizan las misma librerías que el resto de los programas, si no una versión "light" de éstas. La programación minimalista del kernel no la debemos estropear nosotros empotrando en éste módulos que no sean estrictamente necesarios. Los módulos que sean accedidos puntualmente deben de ser cargados bajo demanda y no incluídos en el código del kernel.
Hay que hacer diferenciaciones entres diferentes tipos de kernels, básicamente entre los
vanilla y los optimizados para el uso con una distribución en particular. Los
vanilla, son los que se pueden descargar de
Kernel.org∞ y son liberados por
Linux Torvalds como kernels estables. El usar kernels optimizados para alguna distro en particular puede suponer que si queremos incluir un parche para éste o algún driver tengamos que depender de que los resposables de nuestra distribución lo hayan probado porque si no lo más probable es que sólo consigamos un kernel inestable. Por ésto, y salvo contadas excepciones es preferible usar kernels
vanilla si pretendemos modicarlos luego de algún modo y si buscamos estabilidad por encima de cualquier cosa.
Módulos
Los sistema operativos modernos trabajan en modo protegido, es decir, no permiten acceder al hardware directamente a los programas de la zona usuario. Para ello los que acceden al hardware son los módulos o drivers, que exponen unas determinadas funciones a la zona usuario para su control. En linux tenemos dos formas de manejar dispositivos, empotrando el código en el del kernel, de modo que siempre estará cargado y ofrecerá un mejor rendimiento(no se tiene que cargar porque ya está cargado) o utilizar un módulo que se cargue bajo demanda, que también ofrece un buen rendimiento y no carga al sistema con su presencia de continuo.