FROST
Projektzusammenfassung | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Immer wieder stößt man im Internet auf Menschen, die in Sprachen wie QuickBASIC eigene Betriebssysteme schreiben wollen, und Menschen, die diesen erklären, dass dies mit BASIC nicht funktioniere. Dies traf lange Zeit zu, doch spätestens seit FreeBASIC ist es möglich - und ich bin stolz, hier den Beweis präsentieren zu können: FROST, das (soweit ich gesehen habe) am weitesten fortgeschrittene OS-Projekt mit FreeBASIC.
Bestandteile
Eine startbare FROST-ISO besteht im Grunde aus folgendem:
- GRUB 2 als Bootloader
- Eine grub.cfg für ein GRUB 2 Menü
- Dem FROST-Kernel (frost.krn)
- Dem init-Prozess (noch sehr minimalistisch)
Der Kernel
Der Kernel, FROST V2, verfolgt das Ziel, simpel, verständlich und klar strukturiert zu sein. Dazu wurde auch der Sourcecode entsprechend in "Module" unterteilt. Jedes Modul hat seinen eigenen Namespace und seine eigene Aufgabe - z.B. existiert für den Interrupt-Controller ein eigenes Modul.
Der Kernel ist ein Microkernel, d.h. er wird so klein wie möglich gehalten und die Treiber kommen nicht in den Kernel, sondern landen im Userspace.
Da Stichpunkte für das Auge erfreulicher sind, gibt es jetzt hier die wichtigsten Features von FROST V2:
- Kann entweder silent sein (keine Ausgabe) oder verbose (per -verbose Parameter, der von GRUB 2 angegeben wird)
- Initialisierung der Global-Decriptor-Table mit Ring-0 und Ring-3 Segmenten + Task-State-Segment
- Initialisierung des Programmable-Interrupt-Controllers und remappen der IRQs
- Initialisierung der Interrupt-Descriptor-Table mit allen nötigen Einträgen für Exceptions, IRQs und den Syscall
- Initialisierung des Programmable-Interval-Timers
- Multitasking mit Usermode (d.h. Tasks laufen nicht im Kernelmodus) und Prioritäten (per ticks-Angabe). Nur der Syscall-Interrupt ist für die Tasks zugänglich
- Physical-Memory-Manager für Pages mit Bitmap für 4GB RAM inklusive Auswertung der Memory-Map von GRUB und Markierung des Kernel-Speichers
- Läd übergebene ELF-Module und startet sie als Tasks (momentan noch eingeschränkt)
- Per Paging bekommt jeder Task seinen eigenen Adressraum (momentan noch eingeschränkt)
Wer Appetit bekommen hat, darf sich den Kernel gerne mal ansehen, es gibt noch einiges mehr zu sehen.
Momentan gibt es aber noch viele Lücken, vor allem im Bereich Paging. Wann immer ich Zeit und Lust habe, daran zu arbeiten, werden die natürlich noch gefüllt ;)
Geschrieben ist der Kernel übrigens größtenteils in FreeBASIC, allerdings wird ein paar mal der Inline-Assembler benutzt, und die stubs für die Interrupts sind in einer externen Datei, die von nasm verarbeitet wird.
Der Init-Prozess ist übrigens noch sehr simpel - er ist eigentlich nur ein Testprogramm, der den Syscall testet. Aber er wird seine Aufgabe später auch noch erhalten ;)
Das Repository
Momentan enthält das Repository folgendes:
- Sourcecode des Kernels
- Linkerscript des Kernels
- Makefile des Kernels
- Sourcecode des Init-Prozesses
- Makefile des Init-Prozesses
- Eine grub.cfg
- Ein Skript zum kompilieren und Zusammenstellen einer ISO (getestet auf Kubuntu 11.04)
- Die GPL 3
- Eine README und eine TODO
Ein kleiner Hinweis sei an dieser Stelle angebracht: Das ganze wurde unter Linux geschrieben und getestet. Man kann es sicherlich auch unter Windows zum laufen bekommen, jedoch stellen sich da einige Hürden in den Weg, die da wären: Die Benutztung von GNU make, die Benutzung von ELF 32 als Dateiformat, die Benutztung von GRUB 2...
Und wie schon gesagt, es ist alles Work-In-Progress, wer daran interessiert ist sollte ab und zu einen Blick in das Repository werfen.
Hier jetzt aber schlussendlich der Link zum Projekt auf Sourceforge: Klick
Dort findet ihr auch das git-Repository zum klonen oder online ansehen.
Dateimanager |
---|
Es wurden bisher keine Sources abgelegt. |