# Exonúcleo

En computación, el término exonúcleo (en inglés, exokernel) se refiere a un sistema creado con fines de investigación en el Instituto Tecnológico de Massachusetts sobre OpenBSD y otros sistemas operativos similares. Su propósito es crear una especie de capa de software para otros sistemas virtuales.

## Motivación

Tradicionalmente los diseñadores de núcleos intentaban hacer invisibles los recursos de hardware a las aplicaciones requiriendo que interactúen con el hardware de alguna manera conceptual. Estos modelos incluyen sistemas de archivos para almacenamiento en disco, espacio de direcciones virtual, planificadores para el manejo de las tareas y sockets para las comunicaciones en red. Estas abstracciones del hardware hacían más fácil escribir programas en general, pero limitaban el rendimiento y reprimían la experimentación de nuevas abstracciones. Una aplicación orientada a la seguridad podría necesitar un sistema de archivos que no dejase datos viejos en el disco, mientras que una aplicación orientada a la fiabilidad necesitaría un sistema que almacenase esos datos para recuperación en caso de fallos.
Uno podría optar por eliminar el núcleo completamente y programar directamente para el hardware, pero entonces la máquina entera debería estar dedicada a una sola tarea. Se puede llegar a una solución de consenso: dejar al núcleo destinar los recursos físicos de la máquina (por ejemplo, bloques de disco, páginas de memoria y el tiempo de CPU) a múltiples aplicaciones, y dejar a cada programa decidir qué hacer con esos recursos. El programa podría enlazar una librería de sistema operativo (libOS) que implementa abstracciones comunes, o podría implementar sus propias abstracciones. Teóricamente un sistema basado en exonúcleo podría proveer varias libOSes (librerías de sistema operativo) así como diferentes tipos de sistema operativo podrían ejecutarse bajo el mismo exonúcleo.

## Visión general

La idea tras los exonúcleos es obligar a los desarrolladores a usar el menor número posible de abstracciones, permitiéndoles tomar tantas decisiones como sea posible sobre las abstracciones de hardware. Los exonúcleos son pequeños, ya que su funcionalidad está limitada a asegurar la protección y el multiplexado de recursos, que son muchísimo más simples que las implementaciones del paso de mensajes y las abstracciones de hardware de los núcleos monolíticos tradicionales.
Las aplicaciones pueden pedir direcciones específicas de memoria, bloques de disco, etc. El núcleo solo asegura que el recurso está libre y se permite a la aplicación usarlo. Este acceso de bajo nivel al hardware permite al programador implementar abstracciones personalizadas y omitir las innecesarias, normalmente contribuyendo a un mejor desempeño de la aplicación. Esto también permite a los programadores escoger qué nivel de abstracción desean.
Los exonúcleos pueden ser vistos como una aplicación del principio del "fin al fin" a los sistemas operativos, en el sentido en que no fuerzan a una aplicación a poner sus abstracciones en distintas capas de las que fueron diseñadas con diferentes requisitos en mente. Por ejemplo, en el proyecto del exonúcleo del MIT, el servidor web Cheetah guarda paquetes preformateados del protocolo IP en el disco, y el núcleo garantiza un acceso seguro al disco evitando lecturas y escrituras no permitidas, pero cómo se abstrae el funcionamiento del disco se deja a la elección de las librerías que la aplicación usa.

## Exonúcleo del MIT

El MIT desarrolló dos sistemas operativos basados en exonúcleo, que empleaban dos núcleos: Aegis, una prueba del concepto con soporte limitado para almacenamiento, y XOK, que aplicaba el concepto de exonúcleo más directamente. Una idea esencial del sistema exonúcleo del MIT era que el sistema operativo debería actuar como un ejecutador para pequeños programas suministrados por la aplicación software, que solo están sujetos al requisito de que el exonúcleo debe ser capaz de garantizar que emplean el hardware de forma segura.

### Diseño

Consta de 3 capas, la capa del exonúcleo, la capa LibOS (núcleos de varios sistemas operativos corriendo sobre exonúcleo) y la capa de aplicaciones, corriendo sobre LibOS. El exonúcleo del MIT administra el hardware de la siguiente manera:

#### CPU

El núcleo representa los recursos del procesador como una línea temporal en la cual los programas pueden colocar intervalos de tiempo. Un programa puede ceder el resto de su intervalo de tiempo a otro programa. El núcleo notifica a los programas de los eventos del CPU, como interrupciones, excepciones de hardware, y el inicio o final de un intervalo de tiempo. Si un programa tarda mucho en manejar un evento, el núcleo lo penalizará en las posteriores asignaciones de tiempo, y en casos extremos el núcleo puede abortar el programa.

#### Memoria

El núcleo asigna páginas de memoria física a los programas y controla el Translation Lookaside Buffer (TLB). Un programa puede compartir una página con otro dándole permiso para ello. El núcleo se encarga de asegurar que los programas acceden solo a las páginas que tienen permitidas.

#### Almacenamiento en disco

El núcleo identifica los bloques de disco a las aplicaciones mediante su dirección física, permitiendo a la aplicación que optimice la localización de los datos. Cuando el programa inicializa su uso del disco, suministra al núcleo una función que este puede emplear para determinar qué bloques controla dicho programa. El núcleo usa esta llamada para verificar que cuando asigna un nuevo bloque, el programa solamente solicita el bloque que le fue asignado, además de aquellos que ya controlaba.

#### Redes

El núcleo implementa un filtro de paquetes programable, que ejecuta programas en un lenguaje byte code diseñado para una fácil comprobación de seguridad por parte del núcleo.

### Aplicaciones

Los sistemas operativos (librerías libOS dispuestas sobre el núcleo) disponibles para exonúcleo incluyen el habitual sistema ExOS y un emulador para BSD. Además, el equipo del exonúcleo creó el servidor web Cheetah, que usa el núcleo directamente.

## Rendimiento

El sistema es realmente robusto y flexible, debido a que la única tarea del exonúcleo, es impedir que tengan errores de permisos al hardware y conflictos entre los LibOS. Ejemplo de este diseño se encuentra en ExOS y Extended OpenBSD.

## Historia

El concepto de exonúcleo fue introducido en torno a los finales de 1994, pero aún en 2005 los exonúcleos siguen siendo un gran esfuerzo en investigación y no son usados en ningún sistema operativo comercial popular. Un sistema operativo que sigue la filosofía exonúcleo es Nemesis, escrito por la Universidad de Cambridge, la Universidad de Glasgow, Citrix Systems y el Instituto Sueco de Informática. El MIT también ha desarrollado varios sistemas exonúcleo, como el ExOS.