Por qué estoy construyendo un micronúcleo basado en capacidades desde cero
Los sistemas operativos se encuentran entre los programas más complejas jamás construidas. Gestionan memoria, planifican cómputo, controlan hardware y hacen cumplir los límites de seguridad que protegen cada aplicación que se ejecuta en una máquina.
Sin embargo, muchos de los sistemas operativos de los que dependemos hoy están construidos sobre ideas arquitectónicas que se remontan a varias décadas. Aunque estos sistemas son extraordinariamente potentes y están muy probados, también arrastran décadas de complejidad acumulada.
Este proyecto explora una dirección diferente: construir un sistema operativo moderno de micronúcleo basado en capacidades desde cero, con un fuerte enfoque en autoridad explícita, una base de cómputo confiable (TCB) mínima y una separación estricta entre núcleo y espacio de usuario.
Este sistema operativo se llama EriX.
¿Por qué construir otro sistema operativo?⌗
A primera vista, construir un nuevo sistema operativo parece innecesario. Sistemas maduros como Linux, Windows y BSD ya existen y alimentan miles de millones de dispositivos.
Sin embargo, estos sistemas evolucionaron bajo restricciones históricas. Con el tiempo acumularon capas de abstracciones, mecanismos de compatibilidad e interfaces heredadas. Aunque estas características suelen ser necesarias para software real, también dificultan experimentar con ideas arquitectónicas fundamentalmente distintas.
Los sistemas operativos de investigación han explorado durante mucho tiempo aproximaciones alternativas al diseño de sistemas operativos. Los micronúcleos, los sistemas de capacidades y los núcleos verificados formalmente han demostrado que es posible construir sistemas más pequeños, más seguros y más fáciles de razonar.
El objetivo de EriX no es reemplazar los sistemas operativos existentes. Más bien, es una exploración de cómo podría diseñarse un sistema operativo moderno si empezamos desde primeros principios.
Micronúcleos y la base de cómputo confiable⌗
Una de las ideas centrales detrás de EriX es la arquitectura de micronúcleo.
Los núcleos monolíticos tradicionales incluyen muchos servicios directamente dentro del propio núcleo. Estos suelen incluir:
- controladores de dispositivos
- sistemas de archivos
- pilas de red
- subsistemas de gestión de procesos
Aunque este enfoque puede ser eficiente, también aumenta el tamaño de la base de cómputo confiable (TCB). La TCB incluye cada pieza de código que debe comportarse correctamente para que el sistema siga siendo seguro y fiable.
Los micronúcleos adoptan un enfoque diferente.
Un micronúcleo mantiene dentro del núcleo solo los mecanismos más fundamentales, incluyendo normalmente:
- planificación de hilos
- gestión del espacio de direcciones
- comunicación entre procesos (IPC)
- gestión de capacidades
- manejo de interrupciones y excepciones
Todo lo demás se ejecuta en espacio de usuario, incluyendo controladores, sistemas de archivos y servicios de nivel superior.
Este diseño reduce drásticamente la cantidad de código en la que hay que confiar. Es menos probable que fallos en componentes de espacio de usuario comprometan todo el sistema, y los componentes individuales pueden reiniciarse o sustituirse sin derribar el núcleo.
Seguridad basada en capacidades⌗
Otro principio central de diseño de EriX es la seguridad basada en capacidades.
La mayoría de los sistemas operativos dependen en gran medida de la autoridad ambiental. En estos sistemas, los procesos a menudo tienen acceso implícito a recursos basados en espacios de nombres globales, identidades de usuario o privilegios heredados.
Por ejemplo, un proceso podría abrir un archivo simplemente porque conoce su ruta y el sistema operativo decide que el proceso tiene permiso para acceder.
Los sistemas de capacidades adoptan un enfoque diferente.
Una capacidad es un token infalsificable que concede acceso a un objeto específico con derechos específicos. Un proceso solo puede acceder a un objeto si posee una capacidad que autoriza ese acceso.
Las capacidades tienen varias propiedades importantes:
- Representan autoridad de forma explícita.
- Pueden transferirse entre procesos.
- Pueden restringir operaciones a un conjunto preciso de derechos.
En un sistema basado en capacidades, la autoridad fluye mediante transferencias explícitas en lugar de espacios de nombres globales. Esto hace que el sistema sea más fácil de razonar y ayuda a eliminar clases enteras de vulnerabilidades de seguridad.
¿Por qué Rust?⌗
Tradicionalmente, los sistemas operativos se escriben en C o ensamblador. Estos lenguajes proporcionan control preciso sobre hardware y memoria, pero también facilitan la introducción de errores sutiles.
Los fallos de seguridad de memoria, como uso después de liberar memoria, desbordamientos de búfer y condiciones de carrera, han sido históricamente una de las mayores fuentes de vulnerabilidades en programas de sistemas.
EriX está escrito principalmente en Rust.
Rust ofrece fuertes garantías de seguridad de memoria y, aun así, permite
control de bajo nivel sobre el hardware. El modelo de propiedad del lenguaje
ayuda a prevenir muchas clases de errores en tiempo de compilación, mientras
que los bloques unsafe explícitos hacen visibles y auditables las
operaciones potencialmente peligrosas.
Usar Rust no elimina todos los errores posibles, pero eleva significativamente la línea base de seguridad en programación de sistemas.
Un sistema operativo de sala limpia⌗
Un aspecto inusual del proyecto EriX es su enfoque de desarrollo de sala limpia.
Todos los componentes del sistema se implementan dentro del propio proyecto. No se copia ni incorpora código fuente externo, y no se utilizan bibliotecas de terceros.
Esta restricción cumple varios propósitos:
- Garantiza que todo el sistema pueda entenderse y auditarse.
- Evita dependencias ocultas y comportamientos inesperados.
- Obliga a que las decisiones arquitectónicas sean explícitas en lugar de heredadas.
El desarrollo de sala limpia también convierte el proyecto en un ejercicio educativo. Cada subsistema, desde el cargador de arranque hasta el gestor de memoria, debe diseñarse e implementarse deliberadamente.
Un objetivo a largo plazo: autoalojamiento⌗
Uno de los objetivos a largo plazo de EriX es el autoalojamiento.
Un sistema se considera autoalojado cuando puede compilar su propio código fuente usando herramientas que se ejecutan en el propio sistema.
Para EriX, esto significa que eventualmente:
- el compilador de Rust se ejecuta en EriX
- las herramientas de construcción se ejecutan en EriX
- todo el sistema operativo puede compilarse de forma nativa dentro de EriX
Alcanzar este hito requiere implementar muchas capas de infraestructura, incluyendo sistemas de archivos, gestión de procesos y un entorno de espacio de usuario compatible con POSIX.
¿Por qué documentar el recorrido?⌗
Construir un sistema operativo es un proceso largo y complejo. Muchas de las ideas más interesantes no aparecen en el sistema final, sino en las decisiones, compensaciones y errores encontrados en el camino.
Este blog documenta el desarrollo de EriX a medida que evoluciona. Las futuras publicaciones cubrirán temas como:
- diseñar un formato de imagen de arranque
- implementar espacios de capacidades
- construir un sistema IPC
- gestionar autoridad de memoria
- construir servidores en espacio de usuario
El objetivo es hacer que el proceso de desarrollo sea transparente y educativo.
Mirando hacia adelante⌗
EriX todavía está en una etapa temprana. Gran parte del sistema aún está por construirse, y muchas decisiones de diseño sin duda evolucionarán con el tiempo.
Pero los principios rectores ya están claros:
- núcleo mínimo
- autoridad explícita
- seguridad basada en capacidades
- modularidad estricta
- implementación de sala limpia
En la próxima publicación exploraremos una de las ideas centrales del sistema:
qué son los sistemas operativos basados en capacidades y por qué importan.