Ich suche nach einer Erklärung, was unter Linux passiert, wenn diese Tastenkombination gedrückt wird, um das aktuelle Terminal zu ändern. Welche Softwarekomponente fängt diese Tastenkombination ab und ändert das Terminal? Ist es der Kernel? Wenn es sich um den Kernel handelt, können Sie den Speicherort der Quelldatei angeben, die dies behandelt?
Bearbeiten: Ich möchte verstehen, wie dies sowohl in einer grafischen (X11) als auch in einer textbasierten Umgebung funktioniert.
Antworten:
Es ist der Kernel. Denken Sie daran, dass es sich bei der Tastatur um Hardware handelt und alles, was dort passiert, durch den Kernel geleitet wird. im Falle einer VT-Umschaltung behandelt sie das Ereignis vollständig selbst und gibt nichts an den Userspace weiter (ich glaube jedoch, dass es eine ioctl-bezogene Methode gibt, mit der Userspace-Programme über eine Umschaltung benachrichtigt werden können, die sie betrifft und sie möglicherweise beeinflusst, welches X zweifellos tut).
In den Kernel ist eine Keymap integriert . Dies kann während der Ausführung mit geändert
loadkeys
und angezeigt werden mitdumpkeys
:Die Kernel-Quelle enthält eine Standard-Keymap-Datei, die genau so aussieht. für 3.12.2 ist es
src/drivers/tty/vt/defkeymap.map
. Sie werden auch feststellen, dass es eine entsprechende defkeymap.c- Datei gibt (diese kann mit erzeugt werdenloadkeys --mktable
). Die Behandlung erfolgt inkeyboard.c
(alle diese Dateien befinden sich in demselben Verzeichnis), von dem aus Folgendesset_console()
aufgerufen wirdvt.c
:Ich habe einige Treffer aus dieser Liste herausgeschnitten. Sie können die Funktionssignatur in der vorletzten Zeile sehen.
Das sind also die Dinge, die beim Umschalten eine Rolle spielen. Wenn Sie sich die Reihenfolge der Anrufe ansehen, kehren Sie irgendwann zu
kbd_event()
in zurückkeyboard.c
. Dies ist als Ereignishandler für das Modul registriert:(3.12.2
drivers/tty/vt/keyboard.c
Zeile 1473)Daher
kbd_event()
sollte aufgerufen werden, wenn vom eigentlichen Hardwaretreiber etwas in die Luft sprudelt (wahrscheinlich etwas vondrivers/hid/
oderdrivers/input/
). Sie werden es jedoch nichtkbd_event
außerhalb dieser Datei sehen, da es über einen Funktionszeiger registriert wird.Einige Ressourcen zur Überprüfung des Kernels
printk
Zeilen als einfaches Mittel zur Ablaufverfolgung in die Quelle einfügen (nicht alle Standard-C-Bibliotheken können im Kernel-Code verwendet werden, einschließlich printf von stdio). Printk-Inhalte landen im Syslog.Wolfgang Mauerer hat ein großes Buch über den 2.6er Kernel geschrieben, Professional Linux Kernel Architecture , das einen Großteil der Quellen durchläuft. Greg Kroah-Hartman , einer der Hauptentwickler des letzten Jahrzehnts, hat auch einiges zu bieten.
quelle
keyboard.c
ein Event-Handler vorgesehen wäre. Der "Tastaturtreiber" selbst wäre niedriger - es gibt eine Menge davondrivers/input/keyboard/
für Nicht-USB-Sachen. Usb-Zeug ist standardisiert, es würde also nur eines geben (wahrscheinlich mit einbezogendrivers/hid/usbhid/usbkbd.c
). Ich vermute, dass der Tastaturtreiber für die Erstellung eines Scancodes vorgesehen ist, der an vt / keyboard.c übergeben werden kann (siehe getkeycode () oben).Documentation/input/input.txt
hat einige (wunderbar alte, lol) Andeutungen.