- Ein vollständig in Rust implementiertes grafisches experimentelles Betriebssystem, das ein Unikernel-Design und ein WASM-basiertes Sandboxing-Sicherheitsmodell verwendet
- Kernel, WASM-Engine und alle Apps sind in eine EFI-Binärdatei eingebettet und bieten so eine minimierte Struktur und eine ungewöhnliche System-Call-Schnittstelle
- Läuft in QEMU über VirtIO-basierte Treiber, wobei Eingabe, Netzwerk und GPU-Verwaltung ohne Interrupts per Polling umgesetzt sind
- Unterstützt durch eine globale Event-Loop und kooperatives Scheduling eine vereinfachte Laufzeitstruktur sowie anwendungsbezogenes Ressourcen-Monitoring
- Bietet das eigene UI-Toolkit Uitk sowie integrierte Apps (Webbrowser, Texteditor, Python-Terminal); WASM-Apps lassen sich in verschiedenen Sprachen entwickeln
Was ist Munal OS?
- Munal OS ist ein vollständig in Rust entwickeltes experimentelles Betriebssystem, ein Projekt, das geschaffen wurde, um neue OS-Designs zu erforschen, indem es eine auf Unikerneln basierende Architektur mit WASM-Sandboxing kombiniert
- Ziel ist es, Komplexität zu reduzieren, nur die wesentlichen Bestandteile beizubehalten und mit modernen Werkzeugen eine vereinfachte Systemstruktur zu verwirklichen
Hauptmerkmale
- Unterstützung für eine vollgrafische Umgebung und HD-Auflösung mit Maus- und Tastatur-Interface
- Sandbox-Ausführung von Apps, die den Zugriff von Benutzeranwendungen auf Kernel-Speicher blockiert
- Integrierte Netzwerktreiber und eigener TCP-Stack
- Enthält ein anpassbares UI-Toolkit (Uitk) mit verschiedenen Widgets, flexiblem Layout und Text-Rendering
- Mitgelieferte Apps: Webbrowser (DNS, HTTPS, grundlegendes HTML), Texteditor, Python-Terminal
Architektur
-
Auf EFI-Binärdateien basierende Struktur
- Läuft ohne Bootloader als EFI-Binärdatei; Kernel/WASM-Engine/Apps sind in einer einzigen Datei eingebettet
- UEFI-Boot-Services werden so früh wie möglich beendet und abgesehen von der Systemuhr nicht weiter genutzt
-
Verwaltung des Adressraums
- Kein virtueller Adressraum, stattdessen direkte Nutzung der von UEFI hinterlassenen identity-mapped addresses
- Keine Änderungen an den Seitentabellen. Direkter Schutz des Kernel-Speichers wird stattdessen durch WASM-Sandboxing ergänzt
-
Treiber und Hardware-Unterstützung
- Statt PS/2 oder VGA wurden PCI-Treiber direkt implementiert, die die VirtIO-1.1-Spezifikation nutzen
- Treiber für Tastatur, Maus, Netzwerk und GPU vorhanden
- Keine Verwendung von Interrupts, alle Treiber sind als Polling-System entworfen
- Ausführung auf realer Hardware außerhalb von QEMU wird nicht unterstützt und erfordert weitere Entwicklung
-
Event-Loop und Scheduling
- Keine Unterstützung für Multicore/Interrupts; der gesamte Ablauf wird linear in einer einzelnen globalen Event-Loop ausgeführt
- In jedem Loop-Zyklus werden Netzwerk-/Eingabetreiber gepollt, Desktop-UI und Apps ausgeführt und der GPU-Framebuffer aktualisiert
- Einfache Performance-Analyse, da die Zeit pro Loop-Zyklus messbar ist
- Apps müssen die CPU aktiv freigeben; lang laufende Aufgaben müssen explizit nachgeben
- Basiert auf kooperativem Scheduling; eine erzwungene Beendigung fehlerhafter Apps über die fuel-limit-Funktion der Wasmi-Engine wäre möglich (noch nicht implementiert)
Struktur der Anwendungsausführung
- Die [Wasmi WASM engine] ist integriert und bietet bei der Ausführung von Apps vollständiges Sandboxing und Trennung vom Kernel
- Auf Kernel-Ebene wird eine System-Call-API bereitgestellt, über die Apps Maus-/Tastaturereignisse abfragen, TCP-Sockets nutzen oder auf den Framebuffer ausgeben können
- Die Render-Ausgabe der Apps wird vom OS auf dem Desktop zusammengesetzt und dargestellt
- Apps können auch in anderen Sprachen als Rust erstellt werden; jede Sprache ist nutzbar, solange sie WASM-Builds unterstützt
- WASI-Kompatibilität wird teilweise unterstützt. Keine vollständige Konformität, nur eine minimale Implementierung zur Nutzung wichtiger externer Abhängigkeiten
- Pro App gibt es einen dedizierten Log-Stream (ähnlich stdout), der zusammen mit der Ressourcennutzung in der Desktop-Ansicht „Audit“ eingesehen werden kann
UI-Toolkit (uitk)
- Ein eigenes Immediate-Mode-UI-Kit, das sowohl von Munal OS als auch von WASM-Apps verwendet wird
- Bietet Basis-Widgets (Buttons, Progressbar, Text-Edit, Scroll-Canvas) sowie einen Dreiecks-Rasterizer
- Einheitliches Styling auf Basis eines globalen Stylesheets, mit Unterstützung für Overwrites auf Elementebene
- Effizientes Caching-System zur Vermeidung unnötiger Neurenderings
- Aufteilung in „Tiles“ pro Bereich, mit einem Änderungs-Erkennungsalgorithmus auf Basis der Rust-Mutability-Regeln
Build- und Laufzeitumgebung
- Build und Ausführung sind mit Rust Nightly 2025-06-01 und QEMU 10.0.0 oder neuer möglich
Wichtige Referenzen und Credits
- Rust-OS-Tutorial von Philipp Oppermann und Dokumentation aus dem OSDev Wiki
- Nutzung wichtiger Open-Source-Projekte wie Wasmi, smoltcp, Rustls und RustPython
- Verwendung verschiedener Open-Source-Schriften, Icons und Wallpaper-Ressourcen
Bedeutung und Vorteile von Munal OS
- Die Kombination aus einer einzelnen EFI-Binärdatei und innovativem Sandboxing regt zum Überdenken bestehender OS-Designparadigmen an
- Für die QEMU-Umgebung optimiert und mit einer ungewöhnlichen Polling-basierten Treiberstruktur, wodurch die Abhängigkeit von realer Hardware minimiert wird
- Transparenz bei der Verwaltung von Systemressourcen sowie hoher Lern- und Experimentierwert durch die einfache Struktur
- Großes Potenzial zur Erweiterung des WASM-App-Ökosystems ohne Einschränkungen durch Sprache oder Umgebung
1 Kommentare
Hacker-News-Kommentare
Ich fand die Struktur interessant, bei der in jeder Iteration Netzwerk und Eingabetreiber gepollt werden, die Desktop-Oberfläche gezeichnet wird, jede aktive WASM-Anwendung einen Schritt ausführt und danach der GPU-Framebuffer geflusht wird. Ich habe im Code nachgesehen, wie das mit Wasmi umgesetzt wurde: GitHub-Code-Link. Ich möchte darauf hinweisen, dass in neueren Wasmi-Versionen (v0.45+) die Unterstützung für resumable function calls erweitert wurde, sodass bei aufgebrauchtem Fuel ein Yield möglich ist: Wasmi-Dokumentation. Da bereits Fuel Metering verwendet wird, könnte das auf Ausführungsebene ein effizienterer Ansatz sein. Ein Beispiel für die Nutzung findet sich im Wasmi-Wast-Runner-Beispiel
mallocohnehin explizit erneut versuchen muss, ist mir der konkrete Gewinn nicht klar, deshalb bin ich etwas verwirrtDa die Struktur auf VirtIO basiert, wurde erwähnt, dass Munal OS auf echter Hardware noch nicht läuft. Falls man es auf realer Hardware betreiben wollte, wäre es aus meiner Sicht auch ein interessanter Ansatz, statt eigener Treiber Linux als Bootloader zu verwenden und das Betriebssystem in einem minimalistischen Hypervisor laufen zu lassen. So ließe sich das Konzept „VirtIO ist die Plattform“ beibehalten. Für Apps WASM zu nutzen und für die Plattform VirtIO zu wählen, bewahrt diese Identität auf eine schöne Weise. Aus Sicherheitssicht wäre aber der Einsatz einer MMU nötig. Virtual Memory müsste man vom Design her zwar nicht vollständig einführen, aber allein für Schutzbits entstünden zusätzliche Komplexitäten wie Seitentabellen- und TLB-Verwaltung, was die Einfachheit etwas schwächt
Ein noch größerer Nachteil als die Tatsache, dass der Hauptloop die CPU nicht zu lange blockieren darf und lang laufende Aufgaben ausdrücklich yielden müssen, ist aus meiner Sicht, dass bei vielen geöffneten Apps jede einzelne langsamer wird. Ich habe selten mehr als zehn Apps gleichzeitig offen gehabt, aber aus Erfahrung mit bis zu 30 Tabs würde bei Prozessen für jedes davon der Performance-Verlust deutlich auffallen. Wenn die Hardware schnell genug ist, ist das vielleicht kein Problem, aber bei schweren Aufgaben wie etwa Video-Rendering könnte aus 1 Sekunde schnell 30 Sekunden werden. Trotzdem ist es sehr klug, beeindruckend und spannend, ein ganzes OS auf diese Weise umgesetzt zu haben
Neben dem kooperativen Scheduling scheint auch die Abwehr von Spectre-Angriffen schwierig, und ich frage mich, ob ohne Virtual Memory überhaupt Effizienz möglich ist. Wenn etwa bei
memory.growin WASM der Speicher einer anderen App im Weg ist, müsste man womöglich alles permemmoveverschieben. Ich frage mich, ob das praktikabel ist. Trotzdem ist es ein wirklich beeindruckendes ProjektIch frage mich, wie sich solche Ansätze verändern werden, wenn wasm-Komponenten Wirklichkeit werden. Ich halte das Unikernel-Design für sehr gelungen, und auch die vielen Funktionen von Munal OS sind beeindruckend. Ich hoffe, dass wasm nicht nur für eine einzelne große App, sondern auch zum Hosten vieler kleiner Prozesse und Sub-Umgebungen genutzt wird. Mit wasi preview3 dürfte bald die Koexistenz von synchron und asynchron möglich werden, und damit hätte wasm praktisch alle Bausteine einer allgemeinen Runtime. Weiterhin schade finde ich, dass Host-Object-Bridging in der Realität so stark auf JS ausgerichtet ist, aber ich hoffe, dass das Versprechen von wasm-Komponenten – Standardisierung, Leichtgewichtigkeit, Sandboxing und Sprachkombinierbarkeit – sich in der Praxis als echte Runtime-Fähigkeit statt nur als weiteres Verteilformat zeigt. Dazu passt auch dieser Vortrag: What is a Component (and Why)
Im PyCon-2014-Vortrag „The Birth and Death of Javascript“ wurde eine Zukunft vorgestellt, in der asm.js – der Vorläufer des heutigen wasm – ein OS-Sandboxing umsetzt. Das wirkt auf mich sehr ähnlich zum Kern dieses Projektdesigns, daher frage ich mich, ob das ein Einfluss war: Vortragslink
Ich war überrascht zu sehen, dass dieses OS sogar einen eigenen Webbrowser eingebaut hat: Webbrowser-Quellcode. Im Demo-Video kann man auch sehen, wie Hacker News gerendert wird
Ich finde das erstaunlich und frage mich zugleich, ob so eine Struktur die Zukunft des OS sein könnte. Schon das README ist ziemlich spannend. Mich würde interessieren, warum statt wasmi nicht wasmtime gewählt wurde. Ich würde dieses OS gern selbst in einer VM ausprobieren und hätte sogar Lust, meine GUI-Bibliothek nach Munal zu portieren
Seit den Zeiten von Xerox PARC wird immer wieder versucht, „Userspace in Bytecode zu verwandeln“, und aus Marktsicht waren eigentlich nur IBM i, ChromeOS und Android wirklich erfolgreich. Trotzdem ist dieses Projekt großartig, und ich hoffe, dass es Erfolg hat
Schon das Design dieses Client-OS ist erstaunlich. Ich denke, so eine Struktur wäre auch auf Servern sofort praktisch nutzbar. Wenn man den Kernel extrem klein hält und nur eine einzige laufende App übrig lässt, kann man unnötige Sicherheitsgrenzen reduzieren. Ein Key/Value-Store würde etwa gut zu so einer Struktur passen. Mich würde interessieren, ob man mit diesem I/O-Modell gute Netzwerkperformance erreicht und ob es beim Hosting von WASM spezielle Techniken geben könnte, um unnötige Speicherkopien zu vermeiden