- Sistema operativo experimental gráfico implementado completamente en Rust, que usa un diseño unikernel y un modelo de seguridad con sandboxing basado en WASM
- El kernel, el motor WASM y todas las apps están integrados en un binario EFI, lo que ofrece una estructura minimizada y una interfaz de llamadas al sistema distintiva
- Funciona en QEMU mediante drivers basados en VirtIO, y la gestión de entrada, red y GPU está implementada con sondeo en lugar de interrupciones
- Mediante un bucle global de eventos y planificación cooperativa, soporta una estructura de operación simplificada y monitoreo de recursos por aplicación
- Incluye su propio toolkit de UI Uitk y apps integradas (navegador web, editor de texto, terminal de Python), con posibilidad de desarrollar apps WASM en varios lenguajes
Qué es Munal OS
- Munal OS es un sistema operativo experimental desarrollado completamente en Rust, creado para explorar nuevos diseños de SO combinando una arquitectura basada en unikernel con sandboxing WASM
- Busca reducir la complejidad y aplicar solo los elementos esenciales para lograr una estructura de sistema simplificada con herramientas modernas
Características principales
- Soporte para entorno gráfico completo y resolución HD, con interfaz de mouse y teclado
- Ejecución de apps en sandbox, bloqueando el acceso de las aplicaciones de usuario a la memoria del kernel
- Driver de red y pila TCP propia integrados
- Incluye un toolkit de UI personalizable (Uitk), con varios widgets, layout flexible y renderizado de texto
- Apps incluidas por defecto: navegador web (soporte para DNS, HTTPS y HTML básico), editor de texto y terminal de Python
Arquitectura
-
Estructura basada en binario EFI
- Se ejecuta en formato de binario EFI sin bootloader, con el kernel, el motor WASM y las apps integrados en un solo archivo
- Los servicios de arranque de UEFI se cierran lo antes posible y no se aprovechan para nada adicional salvo el reloj del sistema
-
Gestión del espacio de direcciones
- No usa espacio de direcciones virtual, sino que utiliza directamente las direcciones identity-mapped que dejó UEFI
- No hay cambios en las tablas de páginas. La protección directa de la memoria del kernel se complementa con sandboxing WASM
-
Drivers y soporte de hardware
- En lugar de PS/2 o VGA, implementa directamente drivers PCI que aprovechan la especificación VirtIO 1.1
- Incluye drivers para teclado, mouse, red y GPU
- No usa interrupciones; todos los drivers están diseñados con sondeo
- No soporta ejecución en hardware físico fuera de QEMU; se requiere desarrollo adicional a futuro
-
Bucle de eventos y planificación
- No soporta multicore ni interrupciones; toda la operación se ejecuta linealmente en un único bucle global de eventos
- En cada iteración del bucle se hace sondeo de los drivers de red/entrada, se ejecutan la UI del escritorio y las apps, y se actualiza el framebuffer de la GPU
- Facilita el análisis de rendimiento, ya que se puede medir el tiempo de cada ciclo del bucle
- Las apps deben liberar explícitamente el uso del CPU; las tareas largas deben ceder el control de forma explícita
- Está basado en planificación cooperativa, pero podría soportar la finalización forzada de apps defectuosas mediante la función de fuel limit del motor Wasmi (aún no implementado)
Estructura de ejecución de aplicaciones
- Incluye el [motor WASM Wasmi], que al ejecutar apps ofrece sandboxing completo y separación del kernel
- A nivel de kernel ofrece una API de llamadas al sistema, con la que las apps pueden consultar eventos de mouse/teclado, usar sockets TCP, escribir en el framebuffer, etc.
- El resultado de renderizado de las apps es compuesto por el SO y mostrado en el escritorio
- Es posible crear apps también en lenguajes distintos de Rust; no hay restricciones mientras soporten compilación a WASM
- La compatibilidad con WASI es parcial. No cumple completamente con el estándar y solo incluye la implementación mínima necesaria para aprovechar dependencias externas importantes
- Cada app tiene su flujo de logs dedicado (similar a stdout), visible junto al uso de recursos en la vista de “auditoría” del escritorio
Toolkit de UI (uitk)
- Es un kit de UI en modo inmediato propio, usado tanto por Munal OS como por las apps WASM
- Incluye widgets básicos (botones, barras de progreso, edición de texto, canvas con scroll) y un rasterizador de triángulos
- Usa una hoja de estilos global para un estilo unificado, con soporte para overrides por elemento
- Cuenta con un sistema de caché eficiente para evitar rerenderizados innecesarios
- Divide cada área en “tiles” y usa un algoritmo de detección de cambios basado en las reglas de mutabilidad de Rust
Entorno de compilación y ejecución
- Puede compilarse y ejecutarse con Rust Nightly 2025-06-01 y QEMU 10.0.0 o superior
Referencias principales y créditos
- El tutorial de Rust OS de Philipp Oppermann y la documentación de OSDev Wiki
- Uso de proyectos open source importantes como Wasmi, smoltcp, Rustls y RustPython
- Uso de diversas fuentes, íconos y wallpapers de código abierto
Significado y ventajas de Munal OS
- Al combinar una estructura de binario EFI único con sandboxing innovador, replantea el paradigma tradicional de diseño de sistemas operativos
- Está optimizado para el entorno QEMU y su estructura distintiva de drivers basada en sondeo minimiza la dependencia del hardware de sistemas reales
- Ofrece transparencia en la gestión de recursos del sistema, y su estructura simple aporta un alto valor de aprendizaje y experimentación
- Tiene gran potencial para expandir el ecosistema de apps WASM sin restricciones de lenguaje o entorno
1 comentarios
Comentarios en Hacker News
Me pareció interesante que la estructura consista en hacer polling de la red y de los drivers de entrada en cada iteración, dibujar la interfaz de escritorio, ejecutar un paso de cada aplicación WASM activa y luego vaciar el framebuffer de la GPU. Busqué el código por curiosidad para ver cómo implementaron esto con Wasmi en GitHub. Quisiera comentar que en las versiones recientes de Wasmi (v0.45+) se amplió la funcionalidad de llamadas reanudables para que puedan hacer yield cuando se quedan sin fuel documentación de Wasmi. Como ya usa fuel metering, podría ser una forma más eficiente de manejar la etapa de ejecución. Se puede ver un ejemplo de uso en el ejemplo del runner Wast de Wasmi
try/catchen WASM. Si de todos modos hay que reintentar explícitamentemallocdespués de fallar, me confunde cuál sería la diferencia prácticaMencionan que, como depende de VirtIO, Munal OS todavía no funciona en hardware real, y me parece una estrategia interesante que, si quisieran operarlo en hardware real, en lugar de agregar drivers directamente usaran Linux como bootloader y ejecutaran el sistema operativo dentro de un hipervisor mínimo. De esa manera se podría mantener el concepto de que "VirtIO es la plataforma". La identidad de usar WASM para ejecutar apps y VirtIO para la plataforma me parece genial. Pero desde el punto de vista de seguridad sí haría falta usar una MMU. El diseño no necesariamente tendría que incorporar memoria virtual completa, pero usar bits de protección añadiría complejidad extra como tablas de páginas y manejo de TLB, lo que debilita un poco la simplicidad
Más que el hecho de que el bucle de iteración no deba ocupar la CPU por mucho tiempo y que los trabajos largos tengan que hacer yield explícitamente, creo que la desventaja mayor es que, cuantas más apps abras, más lento se vuelve el procesamiento de cada una. Casi nunca he tenido más de 10 apps abiertas a la vez, pero sí he llegado a tener 30 pestañas, y si cada una fuera un proceso la caída de rendimiento sería clarísima. Si el hardware es suficientemente rápido no habría problema, pero por ejemplo tareas pesadas como renderizar video podrían pasar de 1 segundo a 30 segundos, y la diferencia sería enorme. Aun así, implementar un OS entero de esta forma es en sí mismo una idea muy inteligente, impresionante y emocionante
Además del scheduling cooperativo, parece difícil defenderse de ataques Spectre, y también me pregunto si se puede lograr buena eficiencia sin memoria virtual. Por ejemplo, al manejar
memory.growen WASM, si se interpone la memoria de otra app, podría surgir una situación en la que haya que hacermemmovede todo; me pregunto si eso de verdad es viable. Aun así, es un proyecto realmente impresionanteMe pregunto cómo cambiarán este tipo de intentos cuando los componentes wasm se vuelvan realidad. Valoro mucho el diseño de unikernel, y también me impresiona que Munal OS tenga tantas funciones. Espero que wasm no se use solo para una sola app grande, sino también para alojar muchos procesos pequeños y subentornos. En wasi preview3 pronto se abrirá la posibilidad de convivencia entre sincronía y asincronía, y entonces wasm ya tendría todos los elementos de un runtime de propósito general. Sigue dándome pena que el bridging de objetos del host siga tan centrado en JS, pero quisiera que la promesa de los componentes wasm (estándar, ligereza, sandbox, composición entre lenguajes) se mostrara en la práctica como una capacidad real de runtime, y no como solo un formato de distribución. También comparto esta charla What is a Component (and Why)
Vi la charla de Pycon 2014 “The Birth and Death of Javascript”, donde se presenta un futuro en el que asm.js (el precursor del wasm actual) implementa el sandbox de un OS, y me dio la impresión de que esa idea se parece mucho al núcleo del diseño de este proyecto; me pregunto si hubo influencia enlace a la charla
Me sorprendió ver que este OS incluso trae su propio navegador web integrado código del navegador web. En el video de demostración también se puede ver que renderiza Hacker News
Además de parecerme sorprendente, me pregunto si una estructura así podría ser el futuro de los OS. Hasta el readme es bastante interesante. Me da curiosidad por qué eligieron wasmi en vez de wasmtime. Yo también quisiera probar este OS directamente en una VM y hasta me dan ganas de portar mi biblioteca GUI a Munal
no_stdes demasiado complicado, y por eso terminé eligiendo wasmiDesde los tiempos de Xerox PARC se ha repetido constantemente la idea de “convertir el espacio de usuario en bytecode”, y creo que los únicos casos que realmente triunfaron en el mercado fueron IBM i, ChromeOS y Android. Aun así, este proyecto está genial y ojalá le vaya bien
El diseño mismo del OS del lado cliente me parece sorprendente. Creo que una estructura así también tendría utilidad práctica inmediata en servidores. Si haces el kernel muy pequeño y dejas solo una app en ejecución, se podrían reducir fronteras de seguridad innecesarias. Por ejemplo, un key/value store sería ideal para una estructura así. Lo que me da curiosidad es si con este modelo de IO se consigue buen rendimiento de red, y si al alojar WASM se podrían aplicar técnicas especiales para reducir copias de memoria innecesarias