Hier im Forum habe ich jetzt schon diverse Threads zum Thema eines neuen OS für den C64 gesehen. Etwas erstaunt hat mich, dass dabei oft der Fokus auf dem UI liegt -- das sollte meiner Meinung nach eher ein späterer Schritt sein.
Wie würde man heute ein OS planen und bauen? Man versucht, so modular wie möglich zu sein, mit einem möglichst kleinen Kernel -- eine Strategie, die beim C64 vermutlich nicht weit führen würde aufgrund der recht begrenzten Leistungsfähigkeit der Hardware. Trotzdem denke ich, dass man bei der Planung eines neuen OS mit dem beginnen sollte, das definitiv auch in den noch so winzigsten Kernel gehört:
- Prozessverwaltung und Scheduler
- Speicherverwaltung
- IPC
Ich gehe jetzt einfach mal davon aus, dass man heutigen Ansprüchen an ein OS, selbst wenn es auf einer so alten Kiste laufen soll, nicht mehr gerecht würde ohne preemptive multitasking. Das führt direkt auf das erste Problem, das ich mit der Plattform sehe: Wie stellt man mehreren Prozessen Stack zur Verfügung?
Prinzipiell kann ich mir zwei Herangehensweisen vorstellen:
- Man segmentiert den Hardwarestack, so dass jeder Prozess einen Teil davon bekommt. Das führt aber zu sehr kleinen Stacks (der gesamte Hardwarestack ist ja nur eine Page groß), und wenn der Stack eines Prozesses überläuft, zerstört er den eines anderen Prozesses.
- Jeder Prozess bekommt seinen eigenen Stack irgendwo, der über den Hardwarestack kopiert wird, wenn zu diesem Prozess gewechselt wird. Hier wäre der Nachteil, dass das gewaltigen Overhead beim Kontextwechsel mit sich bringt
Fällt jemandem eine dritte Alternative ein?
---
Außerdem wird man beim C64 von vorneherein eine grobe Speicheraufteilung planen müssen. Um später ein GUI zu ermöglichen ist es sicher ratsam, das RAM von D000 - FFFF für den VIC zu reservieren (Bitmap ab E000, "unter" dem I/O Bereich Farbspeicher und Sprites). Damit wäre es naheliegend, die grundlegendsten Kernel-Funktionen in C000 - D000 zu packen, was auch den Vorteil hat, dass ein Bootloader dort problemlos hinschreiben könnte. Der Kernel braucht sicher Verwaltungsinformationen (Seitentabellen, Prozesskontrollblöcke) -- vielleicht schafft man es, diese, sowie weiteren Treibercode, komplett oberhalb von A000 unterzubringen, dann wäre der Bereich von 1000 bis A000 nutzbar für Services und User-Prozesse (ein GUI könnte man vielleicht als solchen realisieren), aber das ist sicherlich Träumerei, da müsste man mal sehen wie weit man kommt.
---
Ebenfalls muss man sich Gedanken über ein Binärformat für ausführbare Programme machen. Es sollte möglich sein, ein Programm an eine beliebige Stelle im freien Speicher zu laden, dazu braucht es dann aber Relokationstabellen.
---
Meiner Meinung nach ist es absolut unmöglich, ein System zu entwerfen, bei dem nicht jeder beliebige User-Prozess die Maschine "übernehmen" kann ... oder einfach nur bei einem Bug das System zum Absturz bringt. Ich denke damit wird man von vorneherein leben müssen, da gibt die Hardware einfach nicht mehr her.
So ein Projekt würde sicher Spaß machen, allerdings habe ich noch keine Vorstellung, ob es überhaupt realisierbar ist. Bin gespannt auf Meinungen/Gedanken/Anregungen...