GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie funktionieren Tastatureingabe und Textausgabe?

Angenommen, ich drücke A Geben Sie einen Texteditor ein und dieser fügt das Zeichen a ein im Dokument und zeigt es auf dem Bildschirm an. Ich weiß, dass die Editor-Anwendung nicht direkt mit der Hardware kommuniziert (es gibt einen Kernel und dazwischen), also was geht in meinem Computer vor?

Akzeptierte Antwort:

Es gibt mehrere 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 anzuzeigen auf dem Bildschirm.

GUI-Anwendungen

Die de facto standardmäßige grafische Benutzeroberfläche von Unix-Systemen ist das X Window System, oft als X11 bezeichnet, weil es in der 11. Version seines Kernprotokolls zwischen Anwendungen und dem Anzeigeserver stabilisiert wurde. Ein Programm namens X-Server befindet sich zwischen dem Kernel des Betriebssystems und den Anwendungen; Es stellt Dienste bereit, darunter das Anzeigen von Fenstern auf dem Bildschirm und das Übertragen von Tastendrücken an das Fenster, das den Fokus hat.

Eingabe

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

Zuerst werden Informationen über das Drücken und Loslassen einer Taste von der Tastatur an den Computer und innerhalb des Computers übertragen. Die Details hängen von der Art der Hardware ab. Ich werde auf diesen Teil nicht näher 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 Hardwareereignis eintritt, löst die CPU einen Interrupt aus, der dazu führt, dass Code im Kernel ausgeführt wird. Dieser Code erkennt, dass das Hardwareereignis ein Tastendruck oder ein Tastenloslassen von einer Tastatur ist, und zeichnet den Scancode auf die den Schlüssel identifiziert.

Der X-Server liest Eingabeereignisse über eine 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 Key Up/Down-Ereignisse 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, und Linux tut dies Scancodes, die es nicht kennt, nicht erneut übertragen).

X nennt den Scancode, den es liest, einen Schlüsselcode . Der X-Server verwaltet eine Tabelle, die Tastencodes in keysyms übersetzt (kurz für „Schlüsselsymbol“). Keycodes sind numerisch, während Keysyms Namen wie A sind , aacute , F1 , KP_Add , Control_L , … Die Tastensymmetrie kann unterschiedlich sein, je nachdem, welche Zusatztasten gedrückt werden (Shift , Strg , …).

Es gibt zwei Mechanismen, um die Zuordnung von Keycodes zu Keysyms 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 mit besserer Unterstützung für mehr Modifikatoren, insbesondere unter anderem für die zweisprachige Konfiguration.

Anwendungen verbinden sich mit dem X-Server 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 derzeit gedrückt sind. Sie können Keysyms sehen, indem Sie das Programm xev ausführen von einem Endgerät. Was die Anwendung mit den Informationen macht, bleibt ihr überlassen; Einige Anwendungen haben konfigurierbare Tastenkombinationen.

In einer typischen Konfiguration, wenn Sie die Taste mit der Bezeichnung A drücken ohne Modifikatoren sendet dies das keysym a zur Bewerbung; Wenn sich die Anwendung in einem Modus befindet, in dem Sie Text eingeben, fügt dies das Zeichen a ein .

Die Beziehung zwischen Tastaturlayout und xmodmap geht detaillierter auf Tastatureingaben ein. Wie funktionieren Mausereignisse unter Linux? gibt einen Überblick über 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.

  • Serverseitiges Rendern :Die Anwendung teilt dem X-Server mit, „diesen String an dieser Position in dieser Schriftart zu zeichnen“. Die Schriftart befindet sich auf dem X-Server.
  • Clientseitiges Rendern :Die Anwendung erstellt ein Bild, das das Zeichen in einer von ihr gewählten Schriftart darstellt, und weist dann den X-Server an, dieses Bild anzuzeigen.
Verwandt:Verwenden Sie ein Passwort, um eine Textdatei zu schützen?

Siehe Wozu dienen die verschiedenen Typen von XWindows-Schriftarten? für eine Diskussion der clientseitigen und serverseitigen Textdarstellung 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 Framebuffer genannten Speicherbereich, den die GPU zur Anzeige aufnimmt. Fortschrittliche Systeme, wie sie auf jedem PC oder Smartphone des 21. Jahrhunderts zu finden sind, ermöglichen es der GPU, einige Operationen direkt auszuführen, um eine bessere Leistung zu erzielen. Letztendlich überträgt die GPU den Bildschirminhalt Pixel für Pixel im Bruchteil einer Sekunde auf den Monitor.

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

Wenn Ihr Texteditor eine Anwendung im Textmodus ist, die in einem Terminal ausgeführt wird, dann 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 Textmodusanwendung 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 Dokument Was sind die Verantwortlichkeiten jeder Pseudo-Terminal (PTY)-Komponente (Software, Master-Seite, Slave-Seite)?

lesen

Eingabe

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

Der Terminal-Emulator empfängt Ereignisse wie „Left gedrückt wurde, während Shift gedrückt wurde war unten". Die Schnittstelle zwischen dem Terminal-Emulator und der Anwendung im Textmodus ist ein Pseudo-Terminal (pty) , ein Zeichengerät, das Bytes überträgt. Wenn der Terminal-Emulator 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 Kodierung als ein oder mehrere Bytes übertragen. Beispielsweise werden in 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 Strg entsprechen oder Alt werden als Escape-Sequenz gesendet . Escape-Sequenzen bestehen typischerweise aus dem Zeichen Escape (Byte-Wert 27 =0x1B =

Linux
  1. Was ist ein Makefile und wie funktioniert es?

  2. So leiten Sie die Ausgabe in eine Datei und Stdout in Linux um

  3. Ssh – Wie fragt Ssh nach einem Passwort, wenn alle Ein- und Ausgaben umgeleitet werden?

  4. Wie man in Putty kopiert und einfügt

  5. So leiten Sie die Ausgabe in eine Datei und stdout um

Wie man Textdateien unter Linux vergleicht und zusammenführt (Teil 2)

So speichern Sie die Linux-Befehlsausgabe in einem Bild oder einer Textdatei

Bash-Scripting:So schreiben Sie Daten in Textdateien

So finden und ersetzen Sie Text in Vim

Bash-Skripting:So geben Sie Text in der Linux-Shell aus und formatieren ihn

So zeichnen Sie Screencasts unter Linux mit angezeigten Mausklicks und Tastenkombinationen auf