2009-03-13 5 views
5

Ich benutze eine generische USB-Tastatur, Linux 2.6.27 mit Gnome Desktop, Gnome-Terminal und Bash-Shell. Ich bin interessiert zu wissen, was in der Software passiert. Wie werden Sonderzeichen von meiner Tastatur mit etwas Codierung zu Zeichen interpretiert und woher kommen die Charakterbilder?Was ist der tatsächliche Pfad der Aktionen passiert, wenn ich eine Taste auf der Tastatur drücke und es auf einer Shell zeigt?

+0

Whoa.Die Antwort darauf kann füllen füllen Bücher oder Bücherregale, abhängig von der Detailebene. – unwind

+0

@unwind Einverstanden. Das erinnert mich an meine Lieblingsinterviewfrage, die ich einmal bei einer Netzwerkfirma gestellt habe. Was passiert, wenn Sie Ihren Browser öffnen und zu einer URL navigieren? –

Antwort

8

Die Linux-Eingabeschicht mit den USB-Treibern erhält Scancodes (im Grunde "KEY 1 DOWN" "KEY 1 UP") von der Tastatur.

X verwendet seine Tastaturbelegung, um Scancodes in Keycodes und X-Eingabeereignisse zu konvertieren.

Die GTK-Eingabemethode konvertiert die Sequenz von Eingabeereignissen in zusammengesetzte Unicode-Zeichen.

Gnome-Terminal codiert diese in UTF-8 für die Shell.

Die Shell ist es egal. es weiß nur, dass es sich um eine Multibyte-Codierung handelt.

Die Shell gibt Multibyte-kodierten Text über das TTY zurück.

Gnome-Terminal decodiert den eingehenden Text und bestimmt Unicode-Codepunkte.

Gnome-Terminal zeichnet Zeichen mit GTK + Funktionen.

GTK + verwendet Pango zum Rendern des Texts 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 an einem Diagramm:

alt text http://osoft.us/system_layers.png

+0

Das Bild ist leer und keine Kopie im Internet. :( –

2

Schau es in Schichten. Die erste ist die Hardware, und ein Gerätetreiber im Linux-Kernel wird spezifische Methoden zum Steuern und Antworten auf die Tastatur haben, zum Beispiel über Statusregister im Gerät und Interrupt-Handler.

Als nächstes ist der Linux-Kernel, der eine Methode haben wird, den richtigen Treiber für jedes zum Booten gefundene Hardware-Teil zu laden. Nach dem Laden entspricht der Gerätetreiber einer Kernel-Treiber-Schnittstelle, die Daten vom Gerät an den Kernel liefert und umgekehrt.

Außerhalb des Kernels sind auf einer bestimmten Ebene der Gerätetreiber und die Hardware sichtbar, normalerweise als Liste im Verzeichnis/dev. Software, wie ein Terminalemulator, der 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 jetzt über eine Reihe von Lese-/Schreib- und ioctl-Operationen. Diese fangen in den Kernel ein (für einige Details siehe die Manpages), zu welchem ​​Zeitpunkt der Kernel mit dem oben geladenen Gerätetreiber kommuniziert. Der Terminal-Emulator 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 sie auf verschiedene Schriftarten zugreifen, je nach Anwendung. (Ich spreche hier im Allgemeinen, weil ich Gnome nicht genau kenne).

Hilft das?