Ich benutze eine generische USB-Tastatur, Linux 2.6.27 mit Gnome Desktop, Gnome-Terminal und Bash-Shell. Mich interessiert, was in der Software passiert. Wie werden Sonderzeichen von meiner Tastatur mit irgendeiner Kodierung zu Zeichen interpretiert und woher kommen die Zeichenbilder?
Antworten
Zu viele Anzeigen?Die Linux-Eingabeebene mit den USB-Treibern erhält Scancodes (im Wesentlichen "KEY 1 DOWN" "KEY 1 UP") von der Tastatur.
X verwendet seine Tastaturbelegung, um Scancodes in Tastencodes und X-Eingabeereignisse umzuwandeln.
Die GTK-Eingabemethode wandelt die Folge von Eingabeereignissen in zusammengesetzte Unicode-Zeichen um.
Gnome-terminal kodiert diese in UTF-8 für die Shell.
Der Shell ist das egal. Sie weiß nur, dass sie es mit einer Multibyte-Kodierung zu tun hat.
Die Shell sendet multibyte-kodierten Text über die TTY zurück.
Gnome-Terminal dekodiert den eingehenden Text und ermittelt Unicode-Codepunkte.
Gnome-Terminal zeichnet Zeichen mit den GTK+-Funktionen.
GTK+ verwendet Pango, um den Text zu rendern, und ruft die X-Bibliothek auf, um die Pixel auf den Bildschirm zu zeichnen.
Der X-Server zeichnet Zeichen in den Bildschirmpuffer und die Grafikkarte zeigt sie an.
Hier ist mein Versuch, ein Diagramm zu erstellen:
Betrachten Sie es in Schichten. Zuerst kommt die Hardware, und ein Gerätetreiber im Linux-Kernel verfügt über spezifische Methoden zur Steuerung und Reaktion auf die Tastatur, z. B. über Statusregister im Gerät und Interrupt-Handler.
Als Nächstes folgt der Linux-Kernel, der über eine Methode verfügt, um den passenden Treiber für jedes beim Booten erkannte Gerät zu laden. Sobald der Gerätetreiber geladen ist, entspricht er einer Kernel-Treiber-Schnittstelle, die Daten vom Gerät an den Kernel weiterleitet und umgekehrt.
Außerhalb des Kernels sind der Gerätetreiber und die Hardware auf irgendeiner Ebene sichtbar, in der Regel als Eintrag im Verzeichnis /dev. Software, wie z. B. ein Terminalemulator, die ein Gerät verwenden muss, erhält über einen Eintrag in /dev Zugriff auf das Gerät.
Die Kommunikation zwischen einer Anwendung auf Benutzerebene und dem Gerät erfolgt nun über eine Reihe von Lese-/Schreib- und ioctl-Operationen. Diese werden in den Kernel eingeschleust (siehe die Handbuchseiten für diese Operationen), woraufhin der Kernel mit dem oben geladenen Gerätetreiber kommuniziert.
Der Terminalemulator zeigt die Zeichen so an, wie Sie sie eingeben (in den meisten Fällen) und wie sie vom Gerät empfangen werden (in den meisten Fällen), indem er Schriftarten verwendet, auf die er zugreifen kann und die sich je nach Anwendung an verschiedenen Stellen befinden. (Ich spreche hier im Allgemeinen, da ich Gnome nicht speziell kenne).
Ist das hilfreich?