LF OS
| LF OS (LittleFox' Operating System) | |
|---|---|
| Entwickler: | LittleFox |
| Akt. Version: | - |
| Lizenz: | MIT |
| OS-Eigenschaften | |
| Plattform: | x86-64 |
| Kernelart: | Microkernel |
| Sprache: | C, C++, Assembler |
| API: | Nativ, später POSIX als lib auf der nativen API |
| Binärformat: | ELF |
| IPC-Methode: | Vor allem shared memory und message passing |
| Homepage | |
Seit über einem Jahrzehnt schreibe ich nun schon immer mal wieder an Betriebssystemen (meist LF OS). Seit etwa November 2018 schreibe ich mehr oder weniger regelmäßig (quasi jede Zugfahrt und inzwischen auch oft einfach so) an der aktuellsten Variante:
- amd64
- UEFI
- Microkernel
Der Plan ist, quasi alles in Userspace-Prozesse zu packen. Alle Prozesse können Dienste bereitstellen, diese werden im Kernel registriert. Andere Prozesse können sich dann Dienste erfragen und bekommen dann PID und Channel ID für IPC um mit dieser Instanz des Dienstes zu kommunizieren. Dienste sind z.B. Blockdevice-Treiber, FS-Treiber, Grafikserver, Terminals, ...
Wenn Dienste von Prozessen implementiert werden und diese Forken, werden die Dienste direkt als Standardimplementierung im fork verwendet. So kann ein Terminal-Emulator z.B. den Terminal Dienst implementieren und in eine Shell forken, die dann automatisch auf diesen Terminal Emulator rendert.
Bis das so weit läuft wirds aber wohl noch etwas dauern ... gerade funktioniert schon
- UEFI Loader
- lädt Kernel und init
- bereitet sinnvolle initiale Speichermappings vor
- Holt Framebuffer vom UEFI für Konsole
- Kernel
- physische Speicherverwaltung mit linked lists
- virtuelle Speicherverwaltung unter Verwendung der Datenstrukturen die die CPU selbst verwendet
- es gibt ein Mapping des gesamten physischen Speichers an eine virtuelle Adresse
- Informationen wofür Pages verwendet werden ist aktuell in Arbeit
- Scheduler
- schönes Logging in den Arbeitsspeicher und COM1 (und auf die Konsole bis ein Prozess den Framebuffer übernimmt)
- ein paar coole Datenstrukturen, ein paar Unit-Tests für diese
- ein paar Syscalls - definiert in einer YAML Datei und automatisch zu C-Code gemacht (Kernel- und Userspace-seitig)
- Anfänge von pthreads -> aktuell aktivste Baustelle
- init
- kann sich den Framebuffer holen und lustige Dinge rendern
- forkt dabei, nutzt pthread_mutex zur synchronisation
- newlib, libc++, libc++abi, compiler-rt, clang mit LF OS Kenntnissen