Was passiert, wenn Strg + Alt + F <Num> gedrückt wird?


38

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.


1
Drücken Sie zur Verdeutlichung diese Tasten in X11 (dh in einer grafischen Sitzung) oder auf der Textkonsole? Die Antwort ist anders.
Derobert

Antworten:


36

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 loadkeysund angezeigt werden mit dumpkeys:

[...]
keycode  59 = F1               F13              Console_13       F25             
        alt     keycode  59 = Console_1       
        control alt     keycode  59 = Console_1       
keycode  60 = F2               F14              Console_14       F26             
        alt     keycode  60 = Console_2       
        control alt     keycode  60 = Console_2       
keycode  61 = F3               F15              Console_15       F27             
        alt     keycode  61 = Console_3       
        control alt     keycode  61 = Console_3
[...]   

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 werden loadkeys --mktable). Die Behandlung erfolgt in keyboard.c(alle diese Dateien befinden sich in demselben Verzeichnis), von dem aus Folgendes set_console()aufgerufen wirdvt.c :

» grep set_console *.c
keyboard.c:     set_console(last_console);
keyboard.c:     set_console(i);
keyboard.c:     set_console(i);
keyboard.c:     set_console(value);
vt.c:int set_console(int nr)
vt_ioctl.c:                     set_console(arg);

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ück keyboard.c. Dies ist als Ereignishandler für das Modul registriert:

(3.12.2 drivers/tty/vt/keyboard.cZeile 1473)

MODULE_DEVICE_TABLE(input, kbd_ids);

static struct input_handler kbd_handler = {
    .event      = kbd_event,   <--- function pointer HERE
    .match      = kbd_match,
    .connect    = kbd_connect,
    .disconnect = kbd_disconnect,
    .start      = kbd_start,
    .name       = "kbd",
    .id_table   = kbd_ids,
};  

int __init kbd_init(void)
{

[...]

    error = input_register_handler(&kbd_handler);           

Daher kbd_event()sollte aufgerufen werden, wenn vom eigentlichen Hardwaretreiber etwas in die Luft sprudelt (wahrscheinlich etwas von drivers/hid/oder drivers/input/). Sie werden es jedoch nicht kbd_eventaußerhalb dieser Datei sehen, da es über einen Funktionszeiger registriert wird.

Einige Ressourcen zur Überprüfung des Kernels

  • Die Linux-Suche nach Querverweis-IDs ist ein großartiges Tool.
  • Die Interactive Linux Kernel Map ist ein interessantes grafisches Frontend für das Querverweistool.
  • Es gibt einige historische Archive der massiven Linux-Kernel-Mailingliste (LKML), die auf mindestens 1995 zurückgeht. einige von ihnen sind nicht gewartet und haben kaputte Suchfunktionen, aber die Gmane scheint sehr gut zu funktionieren. Die Leute haben viele Fragen auf der Mailingliste gestellt und es ist auch ein primäres Kommunikationsmittel zwischen den Entwicklern.
  • Sie können Ihre eigenen printkZeilen 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.


1
Danke, genau das habe ich gesucht. Können Sie näher erläutern, was früher in der Kette passiert? Wie wird der Code in keyboard.c aufgerufen, wenn wir Strg + Alt + F1 drücken? keyboard.c ist nicht der eigentliche "Tastaturtreiber", oder?
user31765

1
Nein, das glaube ich nicht. Es ist alles Teil des tty-Treibers, für den keyboard.cein Event-Handler vorgesehen wäre. Der "Tastaturtreiber" selbst wäre niedriger - es gibt eine Menge davon drivers/input/keyboard/für Nicht-USB-Sachen. Usb-Zeug ist standardisiert, es würde also nur eines geben (wahrscheinlich mit einbezogen drivers/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.txthat einige (wunderbar alte, lol) Andeutungen.
Goldlöckchen

PS. Viele der Kernel-Entwickler befinden sich auf der öffentlich zugänglichen Linux-Kernel-Mailingliste (LKML), und wenn Sie Ihre P & Qs usw. beachten ( tux.org/lkml ), lohnt es sich, dort nachzufragen ... stellen Sie einfach sicher, dass Sie Richten Sie gleich einen Ordner dafür ein, es sind VIELE E-Mails involviert.
Goldlöckchen

Bei genauerer Betrachtung des Codes gibt es in keyboard.c nur drei nicht veraltete Funktionen, die set_console aufrufen: fn_lastcons (), fn_dec_console () und fn_inc_console (). Eine für die letzte Konsole und eine für die rechte oder linke. Daher verstehe ich immer noch nicht, wie set_console () aufgerufen wird, wenn wir Strg + Alt + F <num> drücken. Ich nehme an, wir müssen irgendwo <num> als Parameter an set_console () übergeben. Ich sehe, dass set_console () auch in vt_ioctl.c auftaucht, aber ist das nicht nur für ioctl aus dem User Space, zB von chvt? Es gibt noch einige Lücken in meinem Verständnis.
user31765

1
Es gibt mehr potenziell verwandte Sachen in Treiber / versteckt. Beachten Sie auch 'console_callback ()' in vt.c, das den Switch ausführen kann und oben über DECLARE_WORK registriert ist. Dies bezieht sich auf den Scheduler: lxr.free-electrons.com/ident?i=DECLARE_WORK (dieses Querverweistool kann von makelinux.net/kernel_map gespeist werden, was Sie vielleicht interessant finden); Ich nehme an, das macht diese Funktion zu einer Art "Hauptschleife" für den vt. Offensichtlich ist das fehlende Glied hier genau, wie Tastaturereignisse weitergegeben werden.
Goldlöckchen
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.