Wie funktionieren Tastatureingaben und Texteingaben?


85

Angenommen, ich drücke die ATaste in einem Texteditor. Dadurch wird das Zeichen ain das Dokument eingefügt und auf dem Bildschirm angezeigt. Ich weiß, dass die Editor-Anwendung nicht direkt mit der Hardware kommuniziert (es gibt einen Kernel und andere Dinge dazwischen). Was ist also auf meinem Computer los?

Antworten:


100

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

  1. Eingabe: Das Tastendruckereignis wird von der Tastaturhardware an die Anwendung übertragen.
  2. Verarbeitung: Die Anwendung entscheidet, dass Adas Zeichen angezeigt werden muss , da die Taste gedrückt wurde a.
  3. Ausgabe: Die Anwendung gibt den Befehl zur Anzeige aauf dem Bildschirm.

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 in der 11. Version seines Kernprotokolls zwischen Anwendungen und dem Anzeigeserver stabilisiert wurde. 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 auf das Fenster, das den Fokus hat.

Eingang

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

Zunächst werden Informationen zum Drücken und Loslassen von Tasten 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 eintritt, löst die CPU einen Interrupt aus , der die Ausführung von Code im Kernel verursacht . Dieser Code erkennt, dass das Hardwareereignis ein Tastendruck oder eine Tastenfreigabe von einer Tastatur ist, und zeichnet den Scan-Code auf, der die Taste identifiziert.

Der X-Server liest Eingabeereignisse über eine Gerätedatei , beispielsweise /dev/input/eventNNNunter 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 Tastendruckereignisse mit einem Scan-Code, der mit dem von der Hardware übertragenen Wert identisch sein kann oder nicht (der Kernel kann den Scan-Code von einem tastaturabhängigen Wert in einen gemeinsamen Wert übersetzen, Linux nicht) Scan-Codes, die nicht bekannt sind, werden nicht erneut übertragen .

X ruft den Scan - Code, der eine liest Keycode . Der X - Server unterhält eine Tabelle , die Schlüsselcodes in übersetzt Keysyms (kurz für „Schlüsselsymbol“). Keycodes sind numerische, während Keysyms Namen wie sind A, aacute, F1, KP_Add, Control_L, ... Die keysym kann je nach dem Zusatztasten gedrückt werden ( Shift, Ctrl, ...).

Es gibt zwei Mechanismen, um die Zuordnung von Schlüsselcodes zu Schlüsseln zu konfigurieren:

  • xmodmap ist der traditionelle Mechanismus. Es ist eine einfache Tabelle, die Keycodes einer Liste von Keysyms (unverändert, verschoben, ...) zuordnet.
  • XKB ist ein leistungsfähigerer, aber komplexerer Mechanismus, der mehr Modifikatoren unterstützt, insbesondere die Konfiguration in zwei Sprachen.

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 Tastensymbol gedrückt oder losgelassen wurde und welche Modifikatoren gerade gedrückt werden. Sie können Keysyms anzeigen, indem Sie das Programm xevvon einem Terminal aus ausführen. Was die Anwendung mit den Informationen macht, hängt davon ab. Einige Anwendungen verfügen über konfigurierbare Tastenzuordnungen.

Wenn Sie in einer typischen Konfiguration die Taste Aohne Modifikatoren drücken , wird der Keysym aan die Anwendung gesendet . Befindet sich die Anwendung in einem Modus, in dem Sie Text eingeben, wird das Zeichen eingefügt a.

Die Beziehung zwischen Tastaturlayout und xmodmap wird bei der Tastatureingabe ausführlicher beschrieben. Wie funktionieren Mausereignisse unter Linux? gibt einen Überblick über die Mauseingaben in den unteren Ebenen.

Ausgabe

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

Es gibt zwei Möglichkeiten, ein Zeichen anzuzeigen.

Siehe Wozu dienen die verschiedenen Arten von XWindows-Schriftarten? für eine Diskussion der clientseitigen und serverseitigen Textwiedergabe unter X11.

Was zwischen dem X-Server und der Graphics Processing Unit (dem Prozessor auf der Grafikkarte) passiert, ist sehr hardwareabhängig. Bei einfachen Systemen zeichnet der X-Server einen Speicherbereich namens Framebuffer auf , den die GPU zur Anzeige aufnimmt. Mit fortschrittlichen Systemen, 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 pixelweise im Bruchteil einer Sekunde an den Monitor.

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

Wenn Ihr Texteditor eine Anwendung im Textmodus 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 Anwendung im Textmodus 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 nützlicher Hintergrund sein. Nachdem Sie dies gelesen haben, möchten Sie vielleicht die weitaus detaillierteren Informationen lesen. Welche Aufgaben hat jede Pseudo-Terminal-Komponente (Software, Master-Seite, Slave-Seite)?

Eingang

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

Der Terminal-Emulator empfängt Ereignisse wie " LeftWurde gedrückt, während Shiftwar unten". Die Schnittstelle zwischen dem Terminalemulator und der Textmodusanwendung ist ein Pseudoterminal (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 ASCII-Bereichs werden je nach Zeichen und Codierung als ein oder mehrere Bytes übertragen . Beispielsweise werden bei der UTF-8- Codierung des Unicode- Zeichensatzes Zeichen im ASCII- Bereich als einzelne Bytes codiert, während Zeichen außerhalb dieses Bereichs als mehrere Bytes codiert werden.

Tastendrücke, die einer Funktionstaste oder einem druckbaren Zeichen mit Modifikatoren wie Ctrloder entsprechen, Altwerden als Escape-Sequenz gesendet . Escape-Sequenzen bestehen normalerweise aus dem Zeichen- Escape (Byte-Wert 27 = 0x1B = \033, manchmal als ^[oder dargestellt \e), gefolgt von einem oder mehreren druckbaren Zeichen. Einige Tasten oder Tastenkombinationen haben ein Steuerzeichen , das ihnen in ASCII-basierten Codierungen entspricht (was heutzutage so ziemlich alles ist, einschließlich Unicode): Ctrl+ letterergibt einen Zeichenwert im Bereich von 1 bis 26, Escist das Escapezeichen oben gesehen und ist auch das gleiche wie Ctrl+ [, Tabist das gleiche wie Ctrl+ I,Returnist dasselbe wie Ctrl+ Musw.

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

Wenn Sie in einem Terminal Ctrl+ Vgefolgt von einer Tastenkombination eingeben, wird das erste Byte der Escape-Sequenz buchstäblich aus der Tastenkombination eingefügt. Da Escape-Sequenzen normalerweise nur aus druckbaren Zeichen nach dem ersten bestehen, wird die gesamte Escape-Sequenz wörtlich eingefügt. Siehe Tastenbelegungstabelle? für eine Diskussion von zsh in diesem Zusammenhang.

Das Terminal kann für einige Modifikatorkombinationen dieselbe Escape-Sequenz senden (z. B. senden viele Terminals ein Leerzeichen für beide Spaceund Shift+ Space; xterm verfügt über einen Modus zum Unterscheiden von Modifikatorkombinationen , Terminals, die auf der gängigen vte-Bibliothek basieren, jedoch nicht ). Einige Tasten werden überhaupt nicht übertragen, zum Beispiel Modifikatortasten oder Tasten, die eine Bindung des Terminalemulators auslösen (z. B. ein Kopier- oder Einfügebefehl).

Es ist Aufgabe 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 Terminal-Emulator behält die Cursorposition bei und blättert, wenn der Cursor unter den unteren Bildschirmrand fallen würde.) Die Anwendung kann auch Escape-Sequenzen ausgeben (meistens beginnend mit ^[oder ^]), um das Terminal anzuweisen, Aktionen wie das Bewegen des Cursors auszuführen. Ändern der Textattribute (Farbe, Fettdruck, ...) oder Löschen eines Teils des Bildschirms.

Vom Terminalemulator unterstützte Escape-Sequenzen werden in der termcap- oder terminfo- Datenbank beschrieben. Die meisten Terminalemulatoren sind heutzutage ziemlich eng mit xterm verbunden . Siehe Dokumentation zu LESS_TERMCAP_ * -Variablen? für eine längere Diskussion über Terminal - Capability - Informationsdatenbanken, und wie Cursor von Blinken zu stoppen und Kann ich meine lokale Maschine Terminal Farben die die Maschine , die ich ssh in benutzen? für einige Anwendungsbeispiele.

Anwendung, die in einer Textkonsole ausgeführt wird

Wenn die Anwendung direkt in einer Textkonsole ausgeführt wird, dh auf einem Terminal, das vom Kernel und nicht von einer Terminalemulator-Anwendung bereitgestellt wird, gelten dieselben Prinzipien. Die Schnittstelle zwischen dem Terminal und der Anwendung ist nach wie vor ein Byte-Stream, der Zeichen mit speziellen Schlüsseln und Befehlen überträgt, die 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. B. ü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 entfernte Terminaldatenbank manchmal nicht alle Funktionen des lokalen Terminals kennt.

Remote X11-Anwendung

Das Kommunikationsprotokoll zwischen Anwendungen und dem Server ist selbst 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.


Ich bin mir nicht ganz sicher, aber da die Antwort im Allgemeinen ziemlich detailliert ist, frage ich mich, ob der Teil, in dem "Anwendung in einer Textkonsole ausgeführt wird" steht, möglicherweise nicht den Hinweis enthält, dass dort Dinge wie man 5 keymapsfür die Übersetzung der keycodesto verwendet werden scancodes. Obwohl es sich, wie bereits erwähnt, im Prinzip um ein ähnliches Instrumentarium handelt, ist es doch ein ganz anderes Instrumentarium / Programm, und dies würde möglicherweise weitere Einsichten verdienen. Daneben lautet die Antwort +1 und ist aufgrund der eingebetteten verwandten Fragen großartig.
HumanityANDpeace

Ich habe in tty1 (TERM = linux) gefunden PgUpund bin Ctrl+PgUpnicht zu unterscheiden. Kann das Keysym -> Control Sequence Mapping konfiguriert werden?
Stewbasic

@stewbasic Ja, mit einer von geladenen Keymap loadkeys. Suche nach Fragen mit dem Tag linux console keyboard-layout .
Gilles

@ Gilles danke! Es ist erwähnenswert, dass loadkeys die beiden Zuordnungen keycode -> keysym und keysym -> escape sequence ändert (dies war mir anfangs nicht klar).
Stewbasic

1
Wow, dies muss eine der besten Antworten sein, die ich jemals auf Stackexchange gesehen habe - gut organisiert, beantwortet die Frage, bietet relevanten Kontext, verweist auf andere nützliche Antworten und hat sogar nette ASCII-Grafiken!
Johntron

4

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.