KyberOSpowered by Mach X

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ísticaKyberOSLinuxXNUGNU/HurdseL4
Modelo de núcleomicronúcleo Mach puromonolíticohíbrido: Mach más BSD en el núcleomicronúcleo Mach más servidoresmicronúcleo verificado
Binarios nativosMach-OELFMach-OELFninguno, es un componente
Binarios de Linuxsin modificar, mediante una personalidad Linux (planeada)nativosnofuentes POSIX, no la ABI de ELFno
Personalidades de SOvarias a la vezunauna (BSD)una (el Hurd)lo que tú construyas
Controladores y sistemas de archivosservidores en espacio de usuarioen el núcleoen el núcleo (IOKit)traductores en espacio de usuariocomponentes en espacio de usuario
Modelo de seguridadcapacidades de derechos de puerto; la frontera de la personalidad aíslaautoridad ambiental más LSMBSD más puertos Mach más MACFpuertos y traductorescapacidades formales, con pruebas
Dónde vive la políticaservidores en espacio de usuarioel núcleoel núcleoservidorestú decides
Madurezen desarrollo; corre un shell en QEMUcorre el mundotodos los dispositivos Appleinvestigación, más un port a Debiandefensa, 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.

HitoEstadoQué abarca
M0 a M2ghechoCimientos: 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.
M3hechoIPC 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 shellhechoBase 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.
SMPparcialArranque 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.
M5actualCrecimiento 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.
M6siguienteNúcleo POSIX y VFS: archivos reales bajo las personalidades y luego un /bin/sh real.
M7 a M8planeadoLa personalidad Linux ejecutando binarios sin modificar como invitados y luego una biblioteca C.
M9 y despuésplaneadoAislamiento 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.

  1. 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.

  2. 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.

  3. 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.

  4. Capacidades primero

    El acceso pasa por derechos de puerto. Nada depende de autoridad ambiental, IDs de usuario ni nombres globales.

  5. 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.