it-swarm.com.de

Wie funktionieren Tastatureingabe und Textausgabe?

Angenommen, ich drücke die A Wenn Sie einen Texteditor eingeben, wird das Zeichen a in das Dokument eingefügt und auf dem Bildschirm angezeigt. Ich weiß, dass die Editoranwendung nicht direkt mit der Hardware kommuniziert (es gibt einen Kernel und dazwischen). Was ist also in meinem Computer los?

Es gibt verschiedene Szenarien. Ich werde die häufigsten beschreiben. Die aufeinanderfolgenden makroskopischen Ereignisse sind:

  1. Eingabe: Das Tastendruckereignis wird von der Tastaturhardware an die Anwendung übertragen.
  2. Verarbeitung: Die Anwendung entscheidet das, weil der Schlüssel A gedrückt wurde, muss das Zeichen a angezeigt werden.
  3. Ausgabe: Die Anwendung gibt den Befehl, a auf dem Bildschirm anzuzeigen.

GUI-Anwendungen

Die de facto standardmäßige grafische Benutzeroberfläche von Unix-Systemen ist das X Window System , das häufig als X11 bezeichnet wird, da es sich in der 11. Version seines Kernprotokolls zwischen Anwendungen und dem Anzeigeserver stabilisiert hat. Ein Programm namens X-Server befindet sich zwischen dem Betriebssystemkern und den Anwendungen. Es bietet Dienste wie das Anzeigen von Fenstern auf dem Bildschirm und das Übertragen von Tastendrücken an das Fenster, das den Fokus hat.

Eingang

+----------+              +-------------+         +-----+
| keyboard |------------->| motherboard |-------->| CPU |
+----------+              +-------------+         +-----+
             USB, PS/2, …                 PCI, …
             key down/up

Zunächst werden Informationen über den Tastendruck und die Tastenfreigabe von der Tastatur zum Computer und in den Computer übertragen. Die Details hängen von der Art der Hardware ab. Ich werde nicht weiter auf diesen Teil eingehen, da die Informationen in diesem Teil der Kette gleich bleiben: Eine bestimmte Taste wurde gedrückt oder losgelassen.

         +--------+        +----------+          +-------------+
-------->| kernel |------->| X server |--------->| application |
         +--------+        +----------+          +-------------+
interrupt          scancode             keysym
                   =keycode            +modifiers

Wenn ein Hardware-Ereignis auftritt, löst die CPU ein Interrupt aus, wodurch ein Code im Kernel ausgeführt wird. Dieser Code erkennt, dass das Hardwareereignis ein Tastendruck oder eine Tastenfreigabe von einer Tastatur ist, und zeichnet den Scan-Code auf, der identifiziert der Schlüssel.

Der X-Server liest Eingabeereignisse über ein Gerätedatei , zum Beispiel /dev/input/eventNNN Unter Linux (wobei NNN eine Zahl ist). Immer wenn ein Ereignis auftritt, signalisiert der Kernel, dass Daten von diesem Gerät gelesen werden müssen. Die Gerätedatei überträgt wichtige Auf-/Ab-Ereignisse mit einem Scan-Code, der mit dem von der Hardware übertragenen Wert identisch sein kann oder nicht (der Kernel übersetzt den Scan-Code möglicherweise von einem tastaturabhängigen Wert in einen gemeinsamen Wert und Linux - überträgt die nicht bekannten Scan-Codes nicht erneut ).

X ruft den Scan-Code auf, der einen Schlüsselcode liest. Der X-Server verwaltet eine Tabelle, die Schlüsselcodes in Keysyms (kurz für „Schlüsselsymbol“) übersetzt. Keycodes sind numerisch, während Keysyms Namen wie A, aacute, F1, KP_Add, Control_L,… Sind. Das Keysym kann abweichen abhängig davon, welche Modifikatortasten gedrückt werden (ShiftCtrl,…).

Es gibt zwei Mechanismen zum Konfigurieren der Zuordnung von Schlüsselcodes zu Keysyms:

  • xmodmap ist der traditionelle Mechanismus. Es ist eine einfache Tabelle, die Schlüsselcodes einer Liste von Schlüsselsymbolen zuordnet (unverändert, verschoben,…).
  • XKB ist ein leistungsfähigerer, aber komplexerer Mechanismus mit besserer Unterstützung für mehr Modifikatoren, insbesondere für die zweisprachige Konfiguration.

Anwendungen stellen eine Verbindung zum X-Server her und erhalten eine Benachrichtigung, wenn eine Taste gedrückt wird, während ein Fenster dieser Anwendung den Fokus hat. Die Benachrichtigung zeigt an, dass ein bestimmtes Keysym gedrückt oder losgelassen wurde sowie welche Modifikatoren gerade gedrückt werden. Sie können Keysyms anzeigen, indem Sie das Programm xev von einem Terminal aus ausführen. Was die Anwendung mit den Informationen macht, hängt davon ab; Einige Anwendungen verfügen über konfigurierbare Tastenkombinationen.

In einer typischen Konfiguration, wenn Sie die beschriftete Taste drücken A Ohne Modifikatoren wird das Keysym a an die Anwendung gesendet. Wenn sich die Anwendung in einem Modus befindet, in dem Sie Text eingeben, wird das Zeichen a eingefügt.

Beziehung zwischen Tastaturlayout und xmodmap geht detaillierter auf die Tastatureingabe ein. Wie funktionieren Mausereignisse unter Linux? gibt einen Überblick über die Mauseingaben auf den unteren Ebenen.

Ausgabe

+-------------+        +----------+          +-----+         +---------+
| application |------->| X server |---····-->| GPU |-------->| monitor |
+-------------+        +----------+          +-----+         +---------+
               text or              varies          VGA, DVI,
               image                                HDMI, …

Es gibt zwei Möglichkeiten, ein Zeichen anzuzeigen.

Unter Was sind die Zwecke der verschiedenen Arten von XWindows-Schriftarten? finden Sie eine Erläuterung der clientseitigen und serverseitigen Textwiedergabe unter X11.

Was zwischen dem X-Server und der Grafikverarbeitungseinheit (dem Prozessor auf der Grafikkarte) passiert, ist sehr hardwareabhängig. Bei einfachen Systemen zeichnet der X-Server in einem Speicherbereich namens Framebuffer , den die GPU zur Anzeige aufnimmt. Dank fortschrittlicher Systeme, wie sie auf jedem PC oder Smartphone des 21. Jahrhunderts zu finden sind, kann die GPU einige Vorgänge direkt ausführen, um eine bessere Leistung zu erzielen. Letztendlich überträgt die GPU den Bildschirminhalt Pixel für Pixel im Bruchteil einer Sekunde an den Monitor.

Textmodus-Anwendung, die in einem Terminal ausgeführt wird

Wenn Ihr Texteditor eine Textmodusanwendung ist, die in einem Terminal ausgeführt wird, ist es das Terminal, das die Anwendung für den Zweck des obigen Abschnitts ist. In diesem Abschnitt erkläre ich die Schnittstelle zwischen der Textmodus-Anwendung und dem Terminal. Zuerst beschreibe ich den Fall eines Terminalemulators , der unter X11 läuft. Was ist der genaue Unterschied zwischen einem 'Terminal', einer 'Shell', einem 'tty' und einer 'Konsole'? kann hier ein nützlicher Hintergrund sein. Nachdem Sie dies gelesen haben, möchten Sie vielleicht das weitaus detailliertere lesen Welche Aufgaben hat jede Pseudo-Terminal (PTY) -Komponente (Software, Master-Seite, Slave-Seite)?

Eingang

      +-------------------+               +-------------+
----->| terminal emulator |-------------->| application |
      +-------------------+               +-------------+
keysym                     character or
                           escape sequence

Der Terminalemulator empfängt Ereignisse wie "Left wurde gedrückt, während Shift ausgefallen war". Die Schnittstelle zwischen dem Terminalemulator und der Textmodusanwendung ist ein Pseudo-Terminal (pty) , ein Zeichengerät das Bytes überträgt. Wenn der Terminalemulator ein Tastendruckereignis empfängt, wandelt er dieses in ein oder mehrere Bytes um, die die Anwendung vom pty-Gerät lesen kann.

Druckbare Zeichen außerhalb des Bereichs ASCII) werden je nach Zeichen und Codierung als ein oder mehrere Bytes übertragen. Zum Beispiel im TF-8 = Codierung des Zeichensatzes nicode , Zeichen im Bereich ASCII werden als einzelne Bytes codiert, Zeichen außerhalb dieses Bereichs als mehrere Bytes codiert.

Tastendrücke, die einer Funktionstaste oder einem druckbaren Zeichen mit Modifikatoren wie z Ctrl oder Alt werden als Escape-Sequenz gesendet. Escape-Sequenzen bestehen normalerweise aus dem Zeichen Escape (Byte-Wert 27 = 0x1B = \033, Manchmal dargestellt als ^[ Oder \e), Gefolgt von einem oder mehr druckbare Zeichen. Einige Schlüssel oder Tastenkombinationen haben ein Steuerzeichen , das ihnen in ASCII-basierten Codierungen entspricht (die heute fast alle verwendet werden, einschließlich Unicode): Ctrl+letter ergibt einen Zeichenwert im Bereich von 1–26, Esc ist das oben gezeigte Escape-Zeichen und ist auch dasselbe wie Ctrl+[Tab ist das gleiche wie Ctrl+IReturn ist das gleiche wie Ctrl+M, usw.

Unterschiedliche Terminals senden unterschiedliche Escape-Sequenzen für einen bestimmten Schlüssel oder eine bestimmte Tastenkombination. Glücklicherweise ist das Gegenteil nicht der Fall: Bei einer gegebenen Sequenz gibt es in der Praxis höchstens eine Tastenkombination, die sie codiert. Die einzige Ausnahme ist das Zeichen 127 = 0x7f = \0177, Das häufig vorkommt Backspace aber manchmal Delete.

In einem Terminal, wenn Sie eingeben Ctrl+V gefolgt von einer Tastenkombination, fügt dies das erste Byte der Escape-Sequenz buchstäblich aus der Tastenkombination ein. Da Escape-Sequenzen normalerweise nur aus druckbaren Zeichen nach dem ersten bestehen, wird die gesamte Escape-Sequenz buchstäblich eingefügt. Siehe Schlüsselbindungstabelle? für eine Diskussion von zsh in diesem Zusammenhang.

Das Terminal kann für einige Modifikatorkombinationen dieselbe Escape-Sequenz übertragen (z. B. senden viele Terminals für beide ein Leerzeichen Space und Shift+Space;; xterm hat einen Modus zur Unterscheidung von Modifikatorkombinationen aber Terminals, die auf der beliebten vte-Bibliothek basieren, nicht ). Einige Schlüssel werden überhaupt nicht übertragen, beispielsweise Modifizierertasten oder Schlüssel, die eine Bindung des Terminalemulators auslösen (z. B. ein Kopier- oder Einfügebefehl).

Es liegt an der Anwendung, Escape-Sequenzen in symbolische Schlüsselnamen zu übersetzen, wenn dies gewünscht wird.

Ausgabe

+-------------+               +-------------------+
| application |-------------->| terminal emulator |--->
+-------------+               +-------------------+
               character or
               escape sequence

Die Ausgabe ist eher einfacher als die Eingabe. Wenn die Anwendung ein Zeichen in die pty-Gerätedatei ausgibt, zeigt der Terminalemulator es an der aktuellen Cursorposition an. (Der Terminalemulator behält eine Cursorposition bei und scrollt, wenn der Cursor unter den unteren Bildschirmrand fallen würde.) Die Anwendung kann auch Escape-Sequenzen (meistens beginnend mit ^[ Oder ^]) An ausgeben Weisen Sie das Terminal an, Aktionen wie das Bewegen des Cursors, das Ändern der Textattribute (Farbe, Fettdruck,…) oder das Löschen eines Teils des Bildschirms auszuführen.

Vom Terminalemulator unterstützte Escape-Sequenzen werden in der Datenbank termcap oder terminfo beschrieben. Die meisten Terminalemulatoren sind heutzutage ziemlich eng mit xterm ausgerichtet. Siehe Dokumentation zu LESS_TERMCAP_ * -Variablen? für eine längere Beschreibung der Datenbanken mit Informationen zur Terminalfähigkeit und So verhindern Sie das Blinken des Cursors und Kann ich das Terminal meines lokalen Computers einstellen? Farben, um die der Maschine zu verwenden, in die ich ssh? für einige Verwendungsbeispiele.

Anwendung, die in einer Textkonsole ausgeführt wird

Wenn die Anwendung direkt in einer Textkonsole ausgeführt wird, d. H. In einem Terminal, das vom Kernel und nicht von einer Terminalemulatoranwendung bereitgestellt wird, gelten dieselben Prinzipien. Die Schnittstelle zwischen dem Terminal und der Anwendung ist immer noch ein Bytestrom, der Zeichen überträgt, wobei spezielle Schlüssel und Befehle als Escape-Sequenzen codiert sind.

Remote-Anwendung, auf die über das Netzwerk zugegriffen wird

Remote-Textanwendung

Wenn Sie ein Programm auf einem Remotecomputer ausführen, z. über SSH leitet das Netzwerkkommunikationsprotokoll Daten auf Pty-Ebene weiter.

+-------------+           +------+           +-----+           +----------+
| application |<--------->| sshd |<--------->| ssh |<--------->| terminal |
+-------------+           +------+           +-----+           +----------+
               byte stream        byte stream       byte stream
               (char/seq)         over TCP/…        (char/seq)

Dies ist größtenteils transparent, mit der Ausnahme, dass die Datenbank des Remote-Terminals manchmal nicht alle Funktionen des lokalen Terminals kennt.

Remote X11-Anwendung

Das Kommunikationsprotokoll zwischen Anwendungen und dem Server selbst ist ein Byte-Stream, der über ein Netzwerkprotokoll wie SSH gesendet werden kann.

+-------------+            +------+        +-----+            +----------+
| application |<---------->| sshd |<------>| ssh |<---------->| X server |
+-------------+            +------+        +-----+            +----------+
               X11 protocol        X11 over       X11 protocol
                                   TCP/…

Dies ist größtenteils transparent, mit der Ausnahme, dass einige Beschleunigungsfunktionen wie Filmdecodierung und 3D-Rendering, die eine direkte Kommunikation zwischen der Anwendung und dem Display erfordern, nicht verfügbar sind.

Wenn Sie dies in einem Unix-System sehen möchten, das klein genug ist, um verständlich zu sein, gehen Sie zu Xv6 . Es ist mehr oder weniger die mythische Unix 6. Ausgabe, die die Basis von John Lion's berühmtem Kommentar wurde, der lange als Samizdat verbreitet wurde. Der Code wurde überarbeitet, um unter ANSI C zu kompilieren und moderne Entwicklungen wie Multiprozessoren zu berücksichtigen.

4
vonbrand