¿Qué es un núcleo? ¿Es hardware o software?

Un sistema operativo es básicamente un gestor de los recursos de hardware, que proporciona una interfaz simplificada e independiente del dispositivo a esos recursos (en comparación con el hecho de forzar los registros de la CPU o del dispositivo a mano). En ese papel, también facilita la compartición de esos recursos, por lo que también es responsable de proporcionar aislamiento y seguridad entre procesos ahora separados (o, más recientemente, máquinas virtuales).

Muchas de estas funciones están fuertemente interrelacionadas. Los procesos necesitan que se les asigne tanto la CPU como la memoria. Los dispositivos necesitan memoria e interrupciones, y no suelen estar asignados exclusivamente a un proceso, por lo que el SO necesita compartirlos a través de una capa de abstracción de nivel superior (por ejemplo, sockets, VFS). El kernel es el conjunto de estas piezas que se consideran inseparables -de ahí su nombre- y que se ejecutan independientemente de cualquier usuario/proceso.

Existen, por supuesto, diferencias de opinión sobre qué código es realmente inseparable del resto del kernel y qué código puede ejecutarse realmente (o cómo) como procesos gestionados por el kernel. Los micronúcleos demostraron hace tiempo que muchas cosas que tradicionalmente se consideraban funciones del núcleo pueden ejecutarse en realidad en procesos separados. Un micronúcleo moderno como L4[1] puede incluso ejecutarse de esta manera con un rendimiento comparable al de los "macronúcleos" monolíticos como Linux, y con unas propiedades de seguridad/robustez mucho mejores.

Linux y otros han añadido características como los módulos cargables del núcleo y los sistemas de archivos en el espacio de usuario para abordar algunos de los problemas más acuciantes del enfoque monolítico, pero siguen enturbiando la terminología al tener mucho código en el núcleo que realmente no necesita estar ahí. En un sentido práctico, el kernel es realmente la colección de cosas escritas y mantenidas por la comunidad de desarrolladores del kernel, incluso cuando no se ajusta a las definiciones tradicionales.

[1] http://www.l4hq.org/