HN Show: Mein selbst geschriebenes Hobby-OS läuft endlich auf einem Vintage-IBM-ThinkPad
(github.com/joexbayer)- RetrOS-32 ist ein vollständig eigenes 32-Bit-Hobby-Betriebssystem mit Fokus auf die i386-Architektur und umfasst Grafik, Multitasking und Networking
- Kernel, Utilities und Build-System sind in C und Assembly geschrieben; User-Space-Anwendungen werden in C++ geschrieben, für den Build werden Make und Docker verwendet
- Zu den getesteten realen Hardware-Systemen zählen Lenovo x240, Asus Eee PC Series, Dell Optiplex 780, Samsung N150 Plus, Samsung NP-NC10 und IBM Thinkpad a21p
- Unterstützt werden die Ausführung in QEMU, in v86 von copy.sh sowie das Booten auf echter Hardware; auf realen Geräten wird eine GRUB-ISO verwendet, indem die
.iso-Datei auf USB oder CD gebrannt wird - In der Roadmap sind Bootloader, präemptives Multithread-Scheduling, Dateisystem, grafischer Window Manager, Netzwerk-Stack, User-Space-Threads, ein entfernter virtueller TCP-Terminalzugang und weitere Punkte als implementiert aufgeführt
Überblick über RetrOS-32
- RetrOS-32 ist ein 32-Bit-Hobby-Betriebssystemprojekt mit Fokus auf die i386-Architektur
- Die Projektbeschreibung bezeichnet es als 32-Bit-Hobby-Betriebssystem mit Grafik, Multitasking und Networking
- Als Startdatum ist der 12. Mai 2022 angegeben
- Die Projektseite verweist auf die Project OSHub page
Login und Benutzer
- Es gibt drei Standardbenutzer: system, admin und guest
- Das Admin-Passwort lautet
admin, guest hat kein Passwort - Derzeit gibt es keinen Unterschied zwischen admin und guest
- Benutzer können mit dem Befehl
admin create <username> <password>erstellt werden
Implementierungssprachen und Build-Konfiguration
- Kernel, Utilities und Build-System sind in C und Assembly geschrieben
- User-Space-Anwendungen sind in C++ geschrieben
- Für die Kompilierung wird Make verwendet
- Für plattformübergreifende Builds wird Docker verwendet
Getestete Hardware
- Die Liste der getesteten realen Hardware lautet wie folgt
- Lenovo x240
- Asus Eee PC series
- Dell Optiplex 780
- Samsung N150 Plus
- Samsung NP-NC10
- IBM Thinkpad a21p
Build- und Ausführungsmethoden
- In plattformübergreifenden Umgebungen werden Docker zum Kompilieren der Image-Datei und QEMU für die Emulation benötigt
- Die Abhängigkeiten für natives Kompilieren unterscheiden sich je nach Plattform
- MacOS:
i386-elf-gcc,i386-elf-ld,i386-elf-g++ - Linux / WSL Ubuntu:
build-essential,gcc-multilib - Wenn GRUB als Bootloader verwendet werden soll, werden außerdem
grub2,xorrisoundxxdbenötigt
- MacOS:
- Unter Linux erfolgt Build und Ausführung in der Reihenfolge Repository klonen,
./debian.sh, Git-Submodule initialisieren,make compile,make img,make qemu - Unter MacOS ist natives Kompilieren derzeit nicht möglich, da die Build-Tools von 32-Bit-x86-Code abhängen; Docker ist der einfachste Weg
- Unter Windows werden Docker oder WSL verwendet
- Es gibt drei Ausführungsarten
- Die
.img-Datei in copy.sh v86 als Festplatten-Image hochladen - In QEMU
make qemuoderqemu-system-i386 <image name>ausführen - Auf echter Hardware die
.iso-Datei auf USB oder CD brennen und die GRUB-ISO verwenden
- Die
Projektstruktur
- Die Repository-Struktur ist in Verzeichnisse für Kernel, Treiber, Grafik, Netzwerk, Dateisystem, Bibliotheken, User-Space-Apps, Tests und Tools gegliedert
bootenthält den Custom-Bootloader undmultiboot.ldkernelenthält die wichtigsten Kernel-Quellen, architekturspezifischen Code und Kernel-Thread-Codeappsenthält User-Space-Anwendungen sowielibcore.a,libgraphic.aundlibnet.anetenthält Networking-Code,fsenthält Code zum Dateisystemtoolsenthält Build-Tools und Skripte
Implementierte Punkte und verbleibende Aufgaben
- Bei den bootbezogenen Punkten sind Custom-Bootloader, GRUB-Kompatibilität und Stage-2-Bootloader abgeschlossen
- Kernel- und Systemfunktionen umfassen Folgendes
- präemptives Multithread-Scheduling
- Trennung von Kernel- und User-Space auf Basis von GDT und TSS
- Interrupt-Verarbeitung
- IPC
- System Calls
- User-Space-Threads
- Treiber- und hardwarebezogene Funktionen umfassen PS/2-Tastatur und -Maus, PIT, VESA
640x480x8, RTC, Serial, E1000 und PCI - Bei Dateisystem und Storage sind ATA-IDE-Treiber, ein Ext2-ähnliches Dateisystem, FAT16 sowie Lesen und Schreiben abgeschlossen
- FAT16 unterstützt Dateien bis zu 32 MB
- Atapi ist noch nicht abgeschlossen
- Speicherfunktionen umfassen 32-Bit-virtuellen Speicher, Kernel-
kalloc/kfreesowie User-Space-malloc/free - Grafikfunktionen umfassen Window Manager, GFXLib, Double-Framebuffer-Rendering, Maus-Events, dynamisches Resizing, Vollbild und eine Widget-Bibliothek
- Custom HTML to Widgets ist noch nicht abgeschlossen
- Im Netzwerk-Stack sind Ethernet, IP, ARP, UDP, Socket API, Loopback-Interface, DHCP, DNS, TCP und ein netcat-artiger Befehl abgeschlossen
- Webserver, FTP, IRC, SSH, Telnet, HTTP und HTML sind noch nicht abgeschlossen
- Anwendungen und Tools umfassen Terminal, Window Server, Prozessinformationen, Finder, C-Compiler/Bytecode-Interpreter, eine Custom-VM zur Bytecode-Ausführung, Editor mit Syntax-Highlighting, Rechner, 3D-Spiel, Snake-Spiel im Textmodus, entfernten virtuellen TCP-Terminalzugang und eine LZ-Kompressionsbibliothek
- Die vollständige Liste vorgeschlagener Funktionen und bekannter Issues findet sich unter open issues
Lizenz und Projektlinks
- RetrOS-32 wird unter der MIT License veröffentlicht
- Der Projektlink lautet https://github.com/joexbayer/RetrOS-32
1 Kommentare
Meinungen auf Hacker News
Solche Projekte sind viel schöner anzusehen als öde KI. Verkaufen lässt sich das wohl nicht, aber man sieht, wie ein Techniker seine Fähigkeiten kreativ auslebt.
In meinen späten Teenagerjahren habe ich mich viel mit Hobby-OS-Entwicklung beschäftigt; das war wirklich großartig, und auch heute baue ich gelegentlich kleine Kernel. Das Letzte, was ich gebaut habe, war ein kleiner RISC-V-Kernel, der meiner Partnerin eine Nachricht ausgab.
Ich fände es gut, wenn die Standardsystemschrift eine schmalere Variante wäre. Dann würde das System deutlich eleganter wirken, und an einigen Stellen sieht man auch, dass die Buchstaben mehr horizontalen Platz brauchen.
Man sollte die Breite jedes Zeichens reduzieren und auch den Abstand zwischen den Zeichen so weit wie möglich verringern. Bei der aktuellen Schriftgröße und Auflösung scheint mir 1 Pixel Abstand ausreichend.
Ich kenne mich mit Schriftsystemen nicht gut aus, bin aber von einer monospaced Bitmap-Schrift ausgegangen. Wenn das in der Codebasis zu schwer zu ändern ist, dann ignorier es ruhig.
Ich baue selbst seit einiger Zeit eine Web-OS-Seite von Grund auf und habe kürzlich die gesamte Schriftklasse neu geschrieben, daher fällt mir dieser Punkt besonders auf.
Ich habe mir auch richtiges Font-Rendering angesehen, und es steht auf der To-do-Liste, aber ich habe es immer wieder aufgeschoben.
„Ich habe ein Betriebssystem gebaut!“
„Hm, die Schrift ist nicht so toll.“
Das wirkt wie der Gipfel von HN.
Cool. Ich frage mich, was du anders machen würdest, wenn du heute noch einmal anfangen würdest.
Mich interessiert auch, welche Sprache du für die Low-Level-Teile für geeignet hältst: ob du bei C bleiben, eine einfache C++-Teilmenge verwenden oder eine neuere Sprache in Betracht ziehen würdest.
Es gibt so viel Material dazu; mich würde auch interessieren, wie du das Projekt spannend gehalten hast, statt einfach Code anderer Leute zu kopieren.
Ich hätte vermutlich auch versucht, die UNIX-Abhängigkeiten zu reduzieren.
Bei Sprachen mag ich C wegen der grundlegenden Syntax und des direkten Wegs zum Kern der Sache. Für User-Space-Anwendungen könnte ich auch andere Sprachen in Betracht ziehen.
Ich wollte von Anfang an alles selbst schreiben, und keine Software zu portieren war ein Kernpunkt des Projekts. Im Großen und Ganzen habe ich mich an die Regel gehalten: „Kopiere Ideen, nicht Code.“
Aus der Perspektive von jemandem, der 1977 einen Commodore PET 2001 benutzt hat, ist das wirklich großartig. Ich hatte mit KolibriOS und MenuetOSx64 herumgespielt, und jetzt bekomme ich Lust, selbst ein OS zu bauen. Beeindruckend, dass du es geschafft hast.
Das Projekt ist wirklich beeindruckend, und ich möchte gratulieren. Seit meiner Teenagerzeit mag ich OS-Entwicklung, und es ist schön zu sehen, dass so etwas tatsächlich umgesetzt wurde.
Ich bin auch ein wenig neugierig, wie das Grafik-Subsystem initialisiert wird. Viel Erfolg.
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
Ich wünschte, ich könnte mir Zeit für solche Leidenschaftsprojekte nehmen.
Praktikabilität vergessen, Go-to-Market-Strategie vergessen, Product-Market-Fit vergessen – einfach bauen und lernen.
Eines davon war ein Spielzeug-OS, aber als Low-Level-OS-Entwicklung zu meinem eigentlichen Beruf wurde, kam dieses Projekt zum Stillstand.
Ich bin seit Jahrzehnten in diesem Bereich und versuche, OS-Entwicklung zu lernen. FASM, NASM und FASM-G kenne ich einigermaßen.
Aber ich möchte die Ausgabe von Assembler-Programmen studieren, um zu verstehen, wie ein OS auf Binärebene tatsächlich funktioniert.
Mich würde interessieren, ob du die Instruction Codes einer bestimmten Architektur gelernt hast, wie du Gerätetreiberprogramme angegangen bist und ob du die Schritte zur Entwicklung eines eigenen OS zusammenfassen kannst.
Es gibt auch einige Tutorials, aber sie enthalten oft Bugs, und am Ende baut man faktisch eher deren OS nach.
In die Instruction Codes bin ich nicht so tief eingestiegen; ich habe sie nur beim Bau eines C-Compilers nachgeschlagen und kenne daher nur die gängigsten Grundbefehle.
https://forum.osdev.org/
https://wiki.osdev.org/Expanded_Main_Page
Wirklich großartig. Ich wünschte, mehr vom Geist der frühen Computerzeit käme zurück, als man mehr am Computer selbst als nur auf Anwendungsebene herumgebastelt hat.
Ich habe darüber nachgedacht, als langfristiges Hobbyprojekt einen Personal Computer zu bauen: einen Computer, bei dem ich den gesamten Software-Stack selbst erstelle und weiß, woher jedes einzelne Bit im System stammt.
Bei der Hardware wäre es schwer, denselben Grad an Kontrolle zu erreichen, außer vielleicht, wenn ein FPGA genug Leistung bietet, um alles auszuführen; aber zumindest bei der Software scheint es möglich.
Bisher wirkte das unrealistisch, aber das hier zeigt, dass es machbar ist. Offenbar wird auch ein Hobby-C-Compiler implementiert: https://github.com/joexbayer/C-Compiler
Den C-Compiler habe ich für dieses OS gebaut, und er läuft innerhalb des OS. Das Projekt wurde zu groß, deshalb wollte ich es aus dem OS-Repository herauslösen, insbesondere weil es auch unter Linux läuft.
Es wäre interessant, wenn du genauer erklären könntest, wie dieser Compiler mit dem Betriebssystem interagiert. Besonders interessiert mich, wie er Funktionen wie Structs behandelt und welche aktuellen Grenzen und geplanten Verbesserungen es in diesem Bereich gibt.
Structs werden als Speicherbereiche behandelt, deren Größe sich aus ihren Membern ergibt, und Member-Zugriffe erfolgen über Offsets innerhalb dieses Bereichs.
Aktuell gibt es viele Einschränkungen, etwa nur int und char und keine switch-Anweisung. Der größte Unterschied zu Standard-C ist, dass Funktionen innerhalb von Structs erlaubt sind und dass bei Struct-Funktionen das Struct implizit an die Funktion übergeben wird. Mehr Details gibt es hier:
https://github.com/joexbayer/C-Compiler
Eines der beeindruckendsten Leidenschaftsprojekte, die ich hier seit ziemlich langer Zeit gesehen habe. Ich frage mich, warum du dich für einen eigenen C-Compiler entschieden hast.