Hallo,
jetzt wirds sehr lang.
Bitte nicht vergessen, das wir hier über ein Hobby-OS reden, das irgendwann mal auch nen GUI haben möchte und auf allem laufen soll ab P75 (mit ein paar Ausnahmen).
Von daher ist der Textmodus bzw. max grafischer Textmodus fürs erste das höchste der Gefühle (auch wenn man bei einem OS am liebsten mit der GUI anfangen würde ).
Richtig: grafischer Textmodus. Drunter finde ich heutzutage unnötig.
Also dein Kernel startet den GUI-Server, dieser lädt einen Grafiktreiber (VESA). Dieser GUI-Server ist jetzt Eigentümer eines Bildschirms und stellt diesen bereit. Wenn du möchtest, kannst du die Fensterverwaltung (also Erzeugen/Zerstören von Fenstern, Verschieben, Fensterdekoration ...) auch im GUI-Server erledigen, wobei die primitive Variante einfach ein einziges Fenster über den gesamten Bildschirm erzeugt und darin eine Terminalemulation startet. Später kannst du daraus einen Full-Feature Window Manager machen.
Diese Terminalemulation stellt jetzt den Anwendungen ein Terminal nebst Informationen über dasselbige zur Verfügung, also vor allem Typ und Größe. Deine Shell wird nun von der Terminalemulation dort hineingeladen und erhält von ihr stdin/stdout/stderr, welche von der Terminalemulation abgefangen werden. Das Text-Zeichnen kannst du nach Wahl in der Terminalemulation oder im GUI-Server machen.
Das ganze Konzept kommt ohne einen Con-Server aus, da es keine reinen Text-Terminals (VGA-Textmodus) gibt. Die Terminals werden von einem Programm - dem Terminalemulator - zur Verfügung gestellt.
Für die Eingabegeräte gibt es einen Input-Server, der sämtliche Eingabegeräte abfragt und die Informationen an den GUI-Server weiterleitet. Dieser leitet die Eingaben, die nicht für ihn sind, in der primitiven Variante an den einzigen Terminalemulator weiter. (Wenn der GUI-Server zu einem Window Manager erweitert wird, leitet er z.B. an das Vordergrundfenster weiter.)
Mit diesem Ansatz sparst du dir zuerst mal das Hickhack, was du unter *BSD/Linux hast, wenn die grafische Oberfläche dem Textmodus ins Handwerk pfuschst und nebenher auch noch mehrere Terminalemulationen ("linux" im Textmodus, "xterm" in der Terminalemulation) und mehrere Grafiktreiber (VGA-Textmode oder vesafb oder KMS im Textmodus, der X11-Treiber im Grafikmodus) hast, die irgendwie verwaltet werden müssen. Das Konzept ist somit eine Mischung und am Anfang recht einfach umzusetzen, aber halt später auf eine GUI ausgerichtet.
Außerdem kämpfen dann nicht zwei Server um begrenzte Ressourcen (Con-/GUI-Server kämpfen sonst um Tastatur und Bildschirm) - es ist nur einer zuständig.
Ok, sprich der GUI-Server meldet sich nicht nur beim Con-Server an, sondern auch beim Input-Server und dieser schickt alle Daten an den GUI-Server, welcher die Daten entsprechend weiterleitet.
Ja. Beziehungsweise du klemmst dir den Con-Server komplett. (Wobei ich nicht wüsste, warum sich der GUI-Server beim Con-Server anmelden müsste. Es kann eh nur einer aktiv sein oder das Umschalten muss von extern geregelt sein.)
Das ist jetzt der Punkt wo ich schwanke. Auf der einen Seite wäre es schön, wenn ich sage das der Con-Server sich um die komplette Fensterverwaltung kümmert (damit meine ich nicht das er das Fenster "erstellen" soll, sondern er "zeichnet" sozusagen die Zeichen in das Fenster).
Das ist Aufgabe des GUI-Servers, denn der hat die Hoheit über den Grafiktreiber und je nach Grafikhardware lässt sich das Zeichenzeichnen hardwareseitig beschleunigen.
Auf der anderen Seite, könnte ich den Con-Server komplett beenden wenn der GUI-Server erstmal läuft. Nur wird es dann auch schwieriger andere Dinge als Zeichen auszugeben (oder könnte man Funktionen wie CLS oder Cursor-Sachen auch als Escape-Sequenzen implementieren?).
Genau diese Funktionen sind Steuerzeichen des Terminals und werden nicht direkt dargestellt, sondern ausgeführt. Guck dir mal ANSI-Sequenzen an und was man damit tun kann (z.B.
hier, auch die Beispiele).
Auch würde es den Con-Server schlanker machen. Von daher wäre diese Variante eigentlich zu favorisieren!
Bei mir so schlank bis auf Null. Du kannst ja später zu Debugzwecken trotzdem einen CON-Server implementieren, der im VGA-Textmodus genau ein Terminal (80x25, ANSI) simuliert. In dem Moment, wo du den GUI-Server startest, sollte dieser inklusive aller enthaltenen Anwendungen beendet werden, da der GUI-Server einen eigenen Grafiktreiber lädt.
Wenn du das so hochziehst - also CON-Server für VGA-Textmodus und GUI-Server für Grafikmodus - bist du insofern auch von der Ausgabeschnittstelle unabhängig. Schließlich kannst du ja auch weitere Server starten, z.B. einen X-Server oder ein serielles Terminal, die dann natürlich unabhängig von CON- und GUI-Server sind.
Jetzt wirds wieder unverständlich. Das Problem welches ich habe ist, das ich zwischen einem normalen Fenster und einem Konsolenfenster schon unterscheide und Vereinfachungen vornehmen würde. Deswegen ja die ganze Geschichte mit dem Con-Server zusammen.
Ich würde da keine Unterscheidung vornehmen. Wenn du ein Textmodus-Programm ohne stdin/stdout/stderr startest, hat es halt keine Möglichkeit, damit zu arbeiten und gut. Für Hintergrundprogramme ist das durchaus gängige Praxis (Eingaben via Konfigdateien und Ausgaben via System-Log-Mechanismen).
Auch würde ich es nicht wollen, das die Terminal-Emulations-Anwendung zwischen TUI und GUI unterscheiden muss. Am liebsten würde ich das so transparent wie möglich halten. Also entweder übernimmt der Con-Server die Fenster-Sachen oder halt der GUI-Server.
Der Terminalemulator ist ein grafisches Programm, in ihm laufen Textprogramme. Wenn du grafische Programme darin startest, dann müssen diese sich selbst darum kümmern, ein Fenster zu erzeugen (indem sie sich z.B. beim GUI-Server melden). Das ist dann nicht mehr Aufgabe der Terminalemulation.
Ich unterscheide übrigens zwischen dem Terminal und dem Terminalemulator. Ersteres ist z.B. der VGA-Textmodus im CON-Server oder eine serielle Leitung mit vt100-Protokoll, auf der ausschließlich Textmodus stattfindet (und stdin/stdout/stderr immer existieren). Letzteres ist ein grafisches Programm, welches ein Terminal zur Verfügung stellt.
Eine andere Frage wäre, wie läuft das denn unter Linux, kann man da auf ein Programm welches ncurses benutzt einfach nen Doppel-Klick machen und der richtige Terminal-Emulator wird aufgerufen oder klappt es nur so, das man nen Terminal-Emulator öffnet und dann erst das Programm starten kann?
Nein. Startest du ein Textprogramm wie "mc" ohne Terminalemulator unter X11, dann läuft der zwar, kann aber nichts ausgeben, da er kein stdout hat. Da sämtliche Cursorbewegungen als Steuerzeichen im Terminal codiert sind, unterscheidet sich ein ncurses-Programm nicht von einem primitiven Programm wie "ls": beide nutzen stdout, um ihre Darstellung zu erledigen.
Du könntest natürlich ein Dummy-stdout bereitstellen und wenn da Daten auflaufen automatisch einen Terminalemulator starten und dem das stdout der Anwendung übergeben. Das wäre praktisch.
Programme, die grafisch sind, melden sich unter Linux beim X-Server an. Welcher das ist, erfahren sie wieder über eine Umgebungsvariable, in diesem Fall $DISPLAY. (Das geht auch über IP und somit quer durch ein Netzwerk, ich kann also meinen Firefox auf dem grafikkartenlosen Server in der Ecke starten und sehe das Fenster auf meinem kleinem Notebook.) Bei dir wäre das dann der GUI-Server.
Ist der erste Fall richtig, dann müsste ich ja die Terminal-Emulation schon in den Con-Server und/oder den GUI-Server packen, weil ich ja nicht ohne weiteres jedes Programm mit einem bestimmen Terminal-Emulator verbinden kann.
Die Terminalemulation ist Teil des Terminalemulators. Du kannst ja mehrere davon haben, einen der nur ANSI macht, einen der vt220 kann und einen dritten für IBM-Großrechner. Ergo hat die Terminalemulation im GUI-Server nichts zu tun.
Der sollte nur das Rendering selbst erledigen. (Alternativ lässt du das die Anwendungen selbst machen, das kannst du dir aussuchen. Dann muss der GUI-Server aber die Möglichkeiten bereitstellen, da gewisse Sachen ja hardwarebeschleunigt sein könnten.)
Oder verstehe ich da jetzt wieder was total falsch?
Ich hoffe, ich hab mein Konzept hinreichend ausführlich beschrieben und nicht wieder mit der Anlehnung an die mir bekannten Systeme alles verbrannt.
Ich glaube, das Konzept ist auch hinreichend generisch/flexibel.
außerdem gibt es zu jedem Terminal eine Datei (wird angezeigt von "tty", sowas wie /dev/tty2 [terminal] oder /dev/pts/1 [pseudoterminal] oder /dev/tts/1 [serielle leitung]), auf die man dann Terminal-ioctls anwenden kann.
Blöd gefragt, was kann man denn alles mit den Terminal-ioctls machen? Oder anders wofür ist das gut (ich will ja eigentlich nicht das Konzept "alles ist eine Datei" umsetzen)?
"Alles ist eine Datei" ist aber praktisch.
Allerdings kann ich dir diese Frage nicht beantworten. Wie da die Interna sind, weiß ich nicht.
Gruß,
Svenska