Cómo está diseñado KyberOS
Tomar el micronúcleo Mach y mantenerlo puro: micronúcleo, IPC y servidores en espacio de usuario. Ponerle encima una personalidad UNIX y planear una personalidad Linux para que el software de Linux sin modificar pueda correr.
La idea
Linux creció de forma monolítica. Los controladores, los sistemas de archivos y la política de llamadas al sistema comparten un espacio de direcciones y una superficie de fallos, con decenas de millones de líneas. Mach tomó la forma opuesta. Tareas, hilos, puertos, mensajes y memoria virtual son las únicas primitivas del núcleo, y los controladores, los sistemas de archivos y el propio POSIX viven en servidores en espacio de usuario conectados por IPC.
Mach más POSIX no es nuevo. GNU/Hurd lo persigue desde 1990 y XNU lo entregó renunciando a la pureza, con BSD dentro del núcleo. La combinación que nadie ha entregado es un núcleo Mach puro, construido con clang y LLVM en x86_64, con una personalidad de llamadas al sistema de Linux planeada para correr software de Linux sin modificar mientras el formato nativo sigue siendo Mach-O.
Mach puro, sin híbrido
No hay capa BSD en el núcleo. La velocidad debe venir de un IPC rápido, de ayudantes mapeados en cada programa y de una caché de páginas, no de mover política al núcleo.
Varias personalidades
Mach se diseñó para alojar varios entornos de sistema operativo a la vez. KyberOS planea UNIX como el principal y Linux por compatibilidad, como capas delgadas sobre un núcleo POSIX compartido.
Capacidades primero
Los puertos son capacidades, sin autoridad ambiental ni nombres globales. La frontera entre personalidades es también una frontera de aislamiento.
Mach-O nativo
clang y ld64.lld producen hoy el formato nativo Mach-O. ELF debe existir solo dentro de la personalidad Linux.
IPC pensado para la velocidad
Un viaje de ida y vuelta de un mensaje lo paga todo programa del sistema, así que lo medimos en cada compilación. La página de inicio muestra la cifra actual y qué cambió.
Versionado desde el primer día
Una versión semántica y un número de compilación van en cada banner de arranque, de modo que cualquier ejecución se puede rastrear a una compilación.
Cómo se compara
La tabla incluye las filas en las que KyberOS pierde. Es joven y lo que importa es la forma del diseño.
| Característica | KyberOS | Linux | XNU | GNU/Hurd | seL4 |
|---|---|---|---|---|---|
| Modelo de núcleo | micronúcleo Mach puro | monolítico | híbrido: Mach más BSD en el núcleo | micronúcleo Mach más servidores | micronúcleo verificado |
| Binarios nativos | Mach-O | ELF | Mach-O | ELF | ninguno, es un componente |
| Binarios de Linux | sin modificar, mediante una personalidad Linux (planeada) | nativos | no | fuentes POSIX, no la ABI de ELF | no |
| Personalidades de SO | varias a la vez | una | una (BSD) | una (el Hurd) | lo que tú construyas |
| Controladores y sistemas de archivos | servidores en espacio de usuario | en el núcleo | en el núcleo (IOKit) | traductores en espacio de usuario | componentes en espacio de usuario |
| Modelo de seguridad | capacidades de derechos de puerto; la frontera de la personalidad aísla | autoridad ambiental más LSM | BSD más puertos Mach más MACF | puertos y traductores | capacidades formales, con pruebas |
| Dónde vive la política | servidores en espacio de usuario | el núcleo | el núcleo | servidores | tú decides |
| Madurez | en desarrollo; corre un shell en QEMU | corre el mundo | todos los dispositivos Apple | investigación, más un port a Debian | defensa, aeroespacial, embebidos |
KyberOS pierde frente a seL4 en verificación y trayectoria en campo, y la compatibilidad con Linux es un hito, no una función disponible. Ninguna otra fila combina un núcleo Mach puro, un formato nativo Mach-O y binarios de Linux como personalidad invitada.
Personalidades arriba, Mach puro debajo
La entrada de llamadas al sistema del núcleo es un enrutador delgado. Lee el campo de personalidad de la tarea y pasa la llamada al punto de entrada de emulación de esa personalidad. El núcleo nunca interpreta un número de llamada al sistema.
Capas delgadas, núcleo compartido
El núcleo POSIX es una biblioteca enlazada en cada servidor de personalidad, no un proceso compartido, así que la frontera entre personalidades sigue siendo un aislamiento real. Las capas solo manejan lo que difiere: kqueue frente a epoll, clone frente a rfork, sysctl frente a procfs, dialectos de ptrace.
Un servidor grueso, divisiones medidas
La idea de Mach de varios servidores casi nunca se dio, porque el costo del IPC castigaba la descomposición. KyberOS empieza con un servidor por personalidad y lo divide solo donde una medición lo justifique.
Cadena de herramientas
clang y LLVM son la cadena nativa: ld64.lld para Mach-O y ld.lld o GNU ld para el núcleo. LTO, PGO y CFI están planeados. La compilación usa CMake y Ninja, sin autotools en nuestro árbol.
Varios procesadores
Mach se pensó para multiprocesadores antes de que existiera Linux, y KyberOS sigue ese diseño. El procesador de arranque es solo el primero en despertar. Los demás entran por la misma ruta de arranque, se unen a conjuntos de procesadores y toman trabajo de colas de ejecución por procesador bajo una sola política de planificación.
Hoy los hilos del núcleo corren en todas las CPU. Los programas de usuario en una segunda CPU todavía no son confiables y se está rastreando el fallo.
Los procesadores son objetos
En Mach un procesador es un objeto del núcleo con un puerto, no un caso especial en el código. Nada de la CPU 0 debe ser privilegiado.
Conjuntos de procesadores
Los hilos se planifican sobre conjuntos de procesadores y los conjuntos se asignan a procesadores. Agrupar el trabajo es política, y la política vive fuera del núcleo, donde Mach la puso en 1986.
Cesión directa cuando conviene
Cuando un hilo se bloquea, el procesador puede ir directo al hilo que tiene el trabajo en lugar de pasar por una cola. Es una idea del diseño original.
Hitos
El núcleo arranca en QEMU y ejecuta un shell en espacio de usuario sobre IPC de Mach. Los hitos son una dirección, no promesas.
| Hito | Estado | Qué abarca |
|---|---|---|
| M0 a M2g | hecho | Cimientos: arranque multiboot2 y PVH, memoria física, memoria virtual en la mitad alta, heap del núcleo, vm_fault de Mach con copia en escritura, anillo 3, syscall/sysret. |
| M3 | hecho | IPC nativo de Mach: espacios, puertos, mensajes tipados, entrega con bloqueo, notificaciones, RPC de objetos del núcleo y una ruta rápida de cesión directa. |
| M4 y shell | hecho | Base en espacio de usuario: un cargador de arranque Mach-O, tareas en anillo 3, un servidor de consola, composición de spawn y un shell por serial. |
| SMP | parcial | Arranque de procesadores de aplicación, colas por CPU, conjuntos de procesadores e IPI dirigidas. Los programas de usuario en una segunda CPU todavía se están corrigiendo. |
| M5 | actual | Crecimiento del shell y las personalidades: una superficie creciente de llamadas al sistema y los primeros archivos servidos desde espacio de usuario, incluidos programas que el shell carga desde ellos. El enrutador de personalidades está probado. |
| M6 | siguiente | Núcleo POSIX y VFS: archivos reales bajo las personalidades y luego un /bin/sh real. |
| M7 a M8 | planeado | La personalidad Linux ejecutando binarios sin modificar como invitados y luego una biblioteca C. |
| M9 y después | planeado | Aislamiento por capacidades y MAC, arranque seguro, controladores de hardware en espacio de usuario, espacios de nombres y contenedores. |
La carta del núcleo
Toda función del núcleo debe pasar las cinco reglas o ganarse una excepción numerada y fechada en el registro de decisiones, con una medición que la justifique.
El mismo vocabulario
Se construye con tareas, hilos, puertos, mensajes, vm_map, vm_object, objetos de memoria y el planificador. Ningún tipo nuevo de objeto del núcleo.
Mecanismo en el núcleo, política en los servidores
El núcleo ofrece la capacidad y un servidor en espacio de usuario decide cómo usarla.
Se llega por puertos
Las funciones visibles al usuario son interfaces al estilo MIG en puertos servidos por el núcleo. El conjunto de trampas se mantiene pequeño y estable.
Capacidades primero
El acceso pasa por derechos de puerto. Nada depende de autoridad ambiental, IDs de usuario ni nombres globales.
Lo interno es libre, con límites
Épocas, zonas por CPU, búsquedas sin bloqueos y donación de prioridad al estilo turnstile están permitidas tras una interfaz sin cambios y con el mismo comportamiento observable.
Por qué retomar Mach
Mach no perdió por sus méritos. Fue temprano, ambicioso y quedó sin terminar, en una industria que necesitaba software entregado. La industria tomó sus ideas de todos modos, dentro de núcleos que cambiaron pureza por velocidad. Los sistemas de Apple corren sobre XNU, que conservó Mach y le puso BSD dentro. KyberOS mantiene Mach puro.
Nada de esto sería posible si sus autores no lo hubieran escrito. Artículos, manuales y definiciones de interfaces documentaron el diseño lo bastante bien para sobrevivir a su laboratorio. Rochester lo sembró, Pittsburgh lo construyó, Utah lo llevó, GNU lo mantuvo vivo y Apple demostró que sus ideas podían mover mil millones de dispositivos.
KyberOS no es un clon ni nostalgia. Es el mismo proyecto retomado: el micronúcleo que ellos esbozaron, terminado con cuatro décadas de retrospectiva.
Gracias
A la gente de Rochester, Pittsburgh, Utah, Grenoble y Cupertino, y a todos los que compilaron Mach, escribieron para él o creyeron que el núcleo podía ser pequeño: gracias. Desde aquí seguimos nosotros.