Warum sollte es eine andere Möglichkeit geben einen Prozess zu erzeugen bzw. was unterscheidet meinen Runtime-Loader in dem Fall von dem von Linux (vorallem hat Linux eigentlich 2, einem im Kernel und einen in der libc)?
Du musst allgemeine Prozesse erzeugen können, für die du vollständigen Userspace nutzen kannst (Unix-Prinzip ist fork()), aber du brauchst eine minimale Möglichkeit, Prozesse ohne Unterstützung starten zu können. Für dein Mikrokernelkonzept sind das im Speziellen die Services, die dir erst den Userspace geben.
Linux kann nativ ELF ausführen, der Runtime-Loader ist für den Userspace da.
wenn der Runtime-Loader unter anderen OSs defekt ist, können auch keine Prozesse mehr gestartet werden (Vergleich: wenn dein Auto kaputt ist, kannst du solange damit nicht fahren bis es wieder in Ordnung ist).
Ja. In einem Mikrokernel sollten aber zumindest die Services, die den Userspace überhaupt am Leben halten, auch ohne Unterstützung des Userspace gestartet werden können. (Der Bootvorgang ist eine Ausnahme, weil man dort eine Lebendgeburt machen kann.)
Da frage ich mich dann was sind diese anderen Dinge? Denn was außer der ELF Datei zu parsen (und das Process-Image erzeugen) macht denn der Runtime-Loader noch so?
Er erzeugt nicht nur ein Image für den Prozess, sondern muss auch zusätzlich benötigte Libraries finden, laden und daraus Symboltabellen generieren, die er der dynamisch gelinkte Anwendung mitgeben muss. Außerdem kommen eventuell noch Sicherheitsgedanken dazu, also z.B. eine Festlegung, welche Symbole eine bestimmte Anwendung in einem bestimmten Nutzerkontext sehen/nutzen darf. Da kann man einiges konstruieren.
Das native Kernel-Binärformat kann relativ dumm sein (statisch, keine Abhängigkeiten); im Userspace reicht das nicht - darum nimmt man ja einen Runtime-Loader. Wie du deine Services dort einsortierst, weiß ich nicht; es sind zwar Anwendungen, aber ich (als monolithisch versauter Mensch) trenne die streng vom "richtigen" Userspace.
Wer parst den Runtime-Loader, wenn der eine ELF-Datei ist?
Habe ich doch geschrieben, das macht mein Bootloader (wo praktisch auch ein Runtime-Loader drin ist).
OK.
Anders gefragt, wenn du die [Server] nicht irgendwo definierst, wer startet die dann und wenn dieser Jemand sie startet wurden sie ja doch irgendwo definiert. Du kannst ja schlecht den Benutzer danach fragen, das würde ja die Server schon vorraussetzen.
Also wenn ich mir die übliche GRUB-Konfiguration anschaue, dann übergebe ich bei Linux das Kernelbinary und eine initrd/initramfs. Alternativ kannst du ELF-Module laden lassen und er sagt dir sogar, wo er sie hingeladen hat.
-- Pseudo-Bootloader-Konfiguration --
KERNEL /boot/kernel
MODULE /modules/appserver
MODULE /modules/deviceserver
MODULE /modules/consoleserver
MODULE /modules/tuiserver
...
Der Kernel startet alle Module, die ihm vorgesetzt wurden. Alle weiteren Services, die nicht boot-kritisch sind, werden später geladen. Was ist daran so schlecht?
Erstmal richtig, aber ich gehe halt davon aus, das z.B. entweder der TUI-Server oder der GUI-Server geladen wird und das muss ja irgendwo in irgendeinem Skript stehen und ich will nicht tausend Skripts haben.
Du brauchst weder TUI noch GUI, solange keine Anwendungen irgendetwas ausgeben möchten. Da du in deinem Konzept IPC benötigst, wenden die Anwendungen (z.B. init) sich an einen well-known-service, der eine Funktionalität bereitstellt. Ist der noch nicht vorhanden, wird er geladen. Schlägt das Fehl, kriegt die Anwendung einen Fehler.
Was du machst, ist trotzdem möglich, aber (für mich) nicht schön.
Jein. Ersten hatten wir es doch schonmal das einen Server zu resetten eher weniger schön ist bzw. bei einigen Sachen wahrscheinlich unmöglich und daher sowieso einen System Neustart erfordert und zweitens rede ich ja nur von den wirklich nötigen Servern. Mit allen anderen Servern habe ich nichts am Hut.
Wenn der Server weg ist, der nötig ist, um ein Binary zu laden, dann ist ein Neustart nötig. Aber um den Bluetooth-Server registrieren zu können, müsste ich ihn bei dir in den Bootloader eintragen (Fehler: System kaputt) und neu starten. Das meinte ich. Wo das nicht mehr geht, geht das halt nicht mehr.
Was du bei der ganzen Sache vergisst (bzw. denke ich das ist deiner Linux Denkart geschuldet ), wenn du einen Service nutzen willst muss dieser auch gestartet sein, sprich wenn du ein "open /dev/audio" machen willst, dann muss das auch vorhanden sein, das ist es aber nur wenn der Server auch gestartet ist, ansonsten gibt es das nicht.
Ich kann auch eine Anfrage an einen Server "SND" machen. Das OS sollte fähig sein, festzustellen, dass es diesen Service nicht gibt und ihn selbstständig nachladen können. Wenn ich in /dev/ eine Datei öffne, die nicht existiert, dann könnte man auch in den vorhandenen Modulen nachschauen, ob ein Modul existiert, welches diese Datei bereitstellt.
Das kann man jetzt so lösen das jedes Programm welches einen bestimmten Service nutzen will, erstmal diesen starten muss und ich denke da sind wir uns beide einig, dass das weniger sinnvoll ist.
Das ist Teil der Serververwaltung, nicht Teil der Anwendung. Richtig.
Ansonsten muss zumindest irgendeine Art Ansprechpartner vorhanden sein, der die Anfrage entgegen nimmt und den Server startet und dann die Anfrage weiterleitet und das wiederrum ist auch nicht wirklich sinnvoll und von Performance will ich erst gar nicht anfangen
Wenn man sich das IPC als eine Art "Bus" vorstellt, dann hast du einen Service-Server, der diesen Bus abhört und weiß, welche Services gerade existieren. Wenn eine Anfrage nach "SND" kommt, es aber kein "SND" gibt, dann blockiert die Anfrage, bis der Service aktiv ist oder wird mit Fehlercode beantwortet, wenn der Server nicht existiert oder nicht gestartet werden konnte.
Das kann ich mir auch im Mikrokernel selbst vorstellen, denn der weiß ja, welche Services existieren.
Er muss aber gestartet und verwaltet werden. Und der Start eines Servers kann recht teuer sein.
Genau das ist/war doch mein Punkt. Da der Start recht teuer sein kann, werden >90% der Nutzen sagen, das der Server lieber von Anfang an "laufen" soll als das man ihn jedes Mal startet wenn er benötigt wird.
Ja, das hängt aber vom Server ab. Im Übrigen gehöre ich dann wohl zu den 10%, die sagen, dass ein Server, der sehr langsam startet,
nicht beim Boot gestartet werden soll, wenn ich ihn nicht benötige.
Wenn er einmal läuft, soll er aber aktiv bleiben.
Dynamisch ladbare Module/Add-Ons. Wie würde man sowas lösen mit nem Runtime-Loader der im UserSpace läuft?
Ich dachte da jetzt daran, das mein Runtime-Loader einfach immer im Adressraum bleibt und einfach als Systempages gekennzeichnet wird und wenn das Programm ein Modul laden will (dlopen() usw.) dann wird einfach der Runtime-Loader wieder "freigegeben" (also als Userpages markiert) und er führt sein dlopen() usw. aus.
Dagegen. Ich würde dlopen() in der libc implementieren und zwar in einer Form, dass der Runtime-Loader selbst diese Funktion benutzen kann, um die Abhängigkeiten aufzulösen. Natürlich muss der Runtime-Loader die Funktion statisch eingelinkt haben (da der Kernel keine dynamischen Dateien ausführen kann).
Sollte man für die Symboltabellen z.B. einen Patricia-Tree nehmen oder einfach nur ein großen Array, was man dann durchgeht? Oder anders gefragt ist Performance beim Symbol-Suchen wichtig und/oder erwünscht (würde ja mit etwas mehr Speicherverbrauch einhergehen)?
Keine Ahnung, nie gehört. Bin kein Informatiker.
Gruß,
Svenska