Maestro - ein UNIX-ähnlicher Kernel in Rust

  Ralf Hersel   Lesezeit: 6 Minuten  🗪 2 Kommentare

Luc Lenôtre stellt Maestro vor, einen Unix-ähnlichen Kernel und ein Betriebssystem, das von Grund auf in Rust geschrieben wurde. Maestro soll leichtgewichtig und kompatibel genug mit Linux sein, um im Alltag genutzt werden zu können.

maestro - ein unix-ähnlicher kernel in rust

Es gibt sie noch, die Wunderkinder. Wie den 13-jährigen Willis Gibson, der am 21. Dezember als erster Mensch Tetris zu Ende gespielt hat, und das nach fast 40 Jahren. Oder Luc Lenêtre, der Student, der mal eben alleine einen UNIX-ähnlichen Kernel in Rust schreibt. Er ist Student an der Schule 42 in Paris. Über sich selbst und seine Motive schreibt er:

Ich bin ein französischer Softwareentwickler. Ich habe mit dem Programmieren begonnen, als ich 10 Jahre alt war und liebe osdev, Systemprogrammierung, Rust und Mathematik. Derzeit schreibe ich mein eigenes Unix-ähnliches Betriebssystem von Grund auf mit der Sprache Rust, nur zum Spaß 🙃.

Falls euch "nur zum Spass" bekannt vorkommt, dann schaut mal hierhin.

In seinem Blog schreibt Lenêtre:

"Der erste Commit des Kernels datiert auf den 22. Dezember 2018, um 3:18 Uhr morgens (die beste Zeit, um Code zu schreiben). Es begann als Schulprojekt. Ursprünglich wurde es in der Sprache C implementiert, und zwar für etwa anderthalb Jahre, bis die Codebasis zu schwer sauber zu halten war. In diesem Moment beschloss ich, zu Rust zu wechseln (mein erstes Projekt in dieser Sprache), was mehrere Vorteile mit sich brachte:

  • Das Projekt von vorne beginnen und dabei die Lehren aus früheren Fehlern ziehen.
  • Etwas innovativer zu sein als nur einen Linux-ähnlichen Kernel in C zu schreiben.
  • Die Sicherheit der Sprache Rust nutzen, um einige Schwierigkeiten der Kernelprogrammierung zu überwinden. Die Verwendung des Typisierungssystems von Rust ermöglicht es, einen Teil der Verantwortung für die Speichersicherheit vom Programmierer auf den Compiler zu verlagern.

Bei der Kernel-Entwicklung ist das Debugging aus mehreren Gründen sehr schwierig:

  • Dokumentation ist oft schwer zu finden, und BIOS-Implementierungen können fehlerhaft sein (häufiger, als man denkt).
  • Beim Booten hat der Kernel vollen Zugriff auf den Speicher und kann dort schreiben, wo er es nicht sollte (z. B. seinen eigenen Code).
  • Die Fehlersuche bei Speicherlecks ist nicht einfach. Tools wie valgrind können nicht verwendet werden.
  • gdb kann mit QEMU und VMWare verwendet werden, aber der Kernel kann sich anders verhalten, wenn er auf einem anderen Emulator oder einer anderen virtuellen Maschine läuft. Außerdem kann es sein, dass diese Emulatoren gdb nicht unterstützen (Beispiel VirtualBox).
  • Einige Funktionen in der Unterstützung für gdb in QEMU oder VMWare fehlen (z.B. Record und Replay) und gdb kann manchmal sogar abstürzen.

All diese Probleme sind Gründe für die Verwendung einer speichersicheren Sprache, um sie so weit wie möglich zu vermeiden. Alles in allem ermöglichte die Verwendung von Rust im Kernel die Implementierung zahlreicher Sicherheitsvorkehrungen. Und ich glaube, dass dies bis heute die beste Entscheidung ist, die ich für dieses Projekt getroffen habe."

Die folgenden Funktionen sind derzeit in Maestro implementiert:

  • Terminal mit VGA-Textmodus und PS/2-Tastatur (mit Vorwärtskompatibilität zu USB, die von der Firmware des Motherboards verwaltet wird)
    • Teilweise Unterstützung von ANSI-Escape-Codes
  • Speicherzuweisung/virtueller Speicher
    • Buddy-Allokator
    • Interner Speicherallokator, der Ähnlichkeiten mit der Implementierung von dlmalloc aufweist und auf dem Buddy-Allokator aufbaut
  • Prozesse und Scheduler (round-robin)
    • POSIX-Signale
  • Aufzählung von PCI-Geräten
  • Dateien:
    • Mountpoints
    • IDE/PATA-Treiber
    • Dateisystem (vorerst nur ext2)
    • Festplattenpartitionen (MBR und GPT)
    • Virtuelle Dateisysteme (/tmp und /proc)
    • initramfs
  • Zeit/Uhr (RTC)
  • Linux-Systemaufrufe (etwa 30% sind derzeit implementiert)
  • Kernel-Module
  • ELF-Programme

Wo steht das Einmann-Projekt zurzeit?

Maestro ist ein monolithischer Kernel, der im Moment nur die x86-Architektur (in 32 Bit) unterstützt. Momentan sind 135 von 437 Linux-Systemaufrufen (etwa 31 %) mehr oder weniger implementiert. Das Projekt hat 48 800 Codezeilen in 615 Dateien (alle Repositories zusammen, gezählt mit dem Befehl cloc). Neben dem Kernel besteht das Betriebssystem derzeit aus den folgenden Komponenten:

  • Solfège: ein Boot-System und ein Daemon-Manager (ähnlich wie systemd, aber weniger aufwendig)
  • maestro-utils: Befehle für Systemdienstprogramme
  • blimp: ein Paketmanager

Bislang wurde die folgende Software von Drittanbietern getestet und funktioniert auf dem Betriebssystem:

  • musl (C-Standardbibliothek)
  • bash
  • Einige GNU coreutils Befehle wie ls, cat, mkdir, rm, rmdir, uname, whoami, etc...
  • neofetch (eine gepatchte Version, da das Original neofetch Maestro nicht kennt)

Selbst ausprobieren

Da sich das Projekt in einer sehr frühen Phase befindet, dürft ihr bezüglich Funktionalität und Stabilität nicht vier erwarten. Hier ist ein ISO-Image und hier die Anleitung zum selbst kompilieren. Ich habe versucht, das Image in GNOME-Boxes zu starten, bin aber nicht über den Startbildschirm hinausgekommen, was so aussah:

Nach Press ENTER passierte nichts mehr. Vielleicht habt ihr mehr Glück.

Quellen:
https://blog.lenot.re/
https://github.com/llenotre/maestro

Tags

Unix, Kernel, Rust, Maestro

kamome
Geschrieben von kamome am 6. Januar 2024 um 00:08

Cool! Aber weniger „obsolete“ wäre https://www.redox-os.org/ ;)

Christoph
Geschrieben von Christoph am 6. Januar 2024 um 13:55

Ich habe nachgesehen: beide Projekte stehen unter der MIT-Lizenz.