Hallo,
.... warum denkst du, sie würden bei uns nicht zu 70% funktionieren?
Ich habe langsam den Eindruck Du willst mich
missverstehen. Ich habe nirgends Euren Code bewertet! Das einzigste von tyndur was ich jetzt ein klein wenig kennen gelernt habe ist der IPC-Mechanismus und das auch nur aufgrund Deiner Beschreibungen. Und eben diese Beschreibungen lassen in mir die subjektive Bewertung "ungenügend" aufkeimen. Aber wirklich beurteilen kann ich gar nichts von tyndur und genau deshalb mach ich das auch nicht.
Was sind die elementarsten Module bei dir
Im Kernel :
- Speicher-Management (Live-Defragmentierung, Paging u.ä. sind aber keine zwingenden Basics und kommen später)
- Process/Thread-Management (aber SMP ist für diese frühe Phase wirklich noch nicht erforderlich)
- einen primitiven Round-Robin-Scheduler (was besseres kann später immer noch kommen)
- IPC (zumindest Messages sync/async und unnamed-Stream-Pipes, die Blockierungsmechanismen müssen noch nicht perfekt sein und unnamed-Packet-Pipes kommen später)
- möglicherweise IRQs
User-Space-Personality :
- init das die anderen Prozesse erzeugt
- einen Prozess der eine Serielle-Schnittstelle als simple Konsole zur Verfügung stellt (PCI-Treiber und alles was drauf aufsetzt währe der nächste Schritt aber als erstes reicht es wenn dieses Programm den UART mit hardcodierten Speicher-Adressen in Betrieb nimmt)
- das eigentliche "Hello World"-Programm das die Konsole, inklusive den 3 Stream-Pipes für stdin/stdout/stderr, öffnet und den String rausschickt
Wenn ich soweit bin ist IMHO damit schon ein Großteil der
elementaren Basics abgehackt.
Ab dann gehts an die PCI-Enumeration/Konfiguration, die Device-Treiber (welche dann vom PCI-Treiber eingebunden werden) und natürlich eine libc (ich würde gerne die glibc protieren aber das sieht nach sehr viel Arbeit aus dafür würde ich wahrscheinlich aber gleich ne Menge Programme geschenkt bekommen also easy portieren können, ob die newlib taugt weis ich noch nicht so genau da liest man auch negatives drüber). Danach (oder besser während dessen) kann ich sicher auch schon mal das ein oder andere Programm portieren. Das währenddessen hängt sehr von den Anforderungen des betreffenden Programms an die libc ab.
Zum einen: Der meiste Quellcode ist einfach kaputt ....
Okay, das ist natürlich ein ernstes Problem. Fixt Ihr dann die Programme? Trifft das auch die coreutils?
Zum anderen - ja, .... Allerdings würde dieser Compilerlauf frühstens in drei Jahren statt jetzt stattfinden.
Und so lange möchte natürlich niemand warten, würde ich auch nicht.
und POSIX komplett kann (tyndur ist übrigens kein *nix, was diese Sache nicht erleichtert)
Mein OS soll auch kein *nix werden. Deshalb möchte ich auf ne ordentliche libc, am liebsten die "richtige", setzen.
Und in der Zwischenzeit, um die Lib zu testen, müsste ich irgendwelche anderen (nutzlosen) Programme schreiben,
Die müssen ja nicht unbedingt nutzlos sein, sicher kann man sich ab diesem Punkt auch mal die Mühe machen ein kleines Programm mit etwas mehr Anpassungsaufwand zu portieren.
.... denn selbst du wirst nicht eine komplette libc schreiben und erst hinterher das erste Hello-World-Programm ausprobieren, oder?
Nein, natürlich nicht. Alles muss ordentlich getestet werden und dazu bieten sich fertige Programme, deren Verhalten man gut kennt, geradezu an. Es muss nur im Rahmen bleiben.
.... da müsste man irgendwann mal das volle Programm mit fork/exec und Vererbung von Dateideskriptoren implementieren.
Braucht man dazu wirklich fork? Ich schätze das kann ich prinzipbedingt nicht vernünftig in mein OS implementieren. Ich wollte eigentlich auf fork verzichten und statt dessen lieber ordentliche Threads anbieten (zusammen mit der pthread-lib). Vererbung von Dateideskriptoren ist bei einem Microkernel-OS doch keine Angelegenheit für den Kernel sondern für den "Virtual File System"-Service.
Du kannst uns dann ja sagen, was deine Erfahrungen damit sind.
Ich werd dran denken.
Du wolltest noch einen Forums-Thread zum Thema IPC-Varianten raussuchen.
Ist schon in Ordnung, es gehört ja zum gleichen Thema, und es gibt ein paar nützliche Infos her
Dann hast Du bestimmt nichts dagegen wenn wir noch etwas weiter vom Thema abkommen.
Für git brauchst Du stdin/stdout/stderr-Umleitung? Hast Du da schon eine Idee? Mir ist eine eingefallen die komplett am Kernel vorbei geht. Interesse?
Du kannst die Idee ja einfach mal vorstellen.
Ich habe mir gedacht das man einen User-Space-Prozess hat der die Funktionalität hinter exec liefert, könnte z.B. der init-Prozess sein.
Man ruft ihn, per RPC, auf und sagt welches Programm mit welchen Parametern gestartet werden soll. Auch die Umgebungsvariablen, das aktuelle Verzeichnis und z.B. die IDs der Stream-Pipes von stdin/stdout/stderr muss man dazu mitteilen. Aus all diesen Informationen schnürt der exec-Prozess einen Datensatz und gibt diesen dem neuen Prozess als "Parameter-Block" mit. Dieser Parameter-Block wird beim Prozess-Start von der crt zerlegt und die Infos passend in die libc verteilt bzw. die Kommandozeilen-Parameter an main weitergereicht. Das hat den Vorteil das nur die crt und der exec-Prozess zueinander kompatibel sein müssen und der Kernel davon überhaupt nichts mitbekommt, auch Änderungen am Parameter-Block kümmern den Kernel nicht, der Kernel muss nur seine Länge wissen und nicht in den Inhalt schauen. Außerdem könnte der exec-Prozess auch das dynamische linken mit Bibliotheken übernehmen, der Kernel bekommt nur noch ein fertiges Monsterbinary (eventuell sogar in einem extra simplen Format) und muss fast nichts damit machen. So bleibt der Kernel simpel. Selbst ein anderes Executable-Format könnte man dann im exec-Prozess implementieren solange das fertig gelinkte Ergebnis im richtigen Simple-Format für den Kernel passt.
Für die stdin/stdout/stderr-Umleitung bedeutet dass das man entweder die vorhandenen Pipes weiterreicht oder neue erstellt und diese selber verarbeitet. Solange der neue Prozess drei funktionierende Pipe-IDs bekommt ist alles in Ordnung. Der Eltern-Prozess muss das nur dem exec-Prozess passend mitteilen und schon ist jede denkbare Variante möglich.
Grüße
Erik