Je cherche une explication de ce qui se passe sous Linux lorsque cette combinaison de touches est pressée pour changer le terminal actuel. En particulier, quel composant logiciel intercepte cette combinaison de touches et modifie le terminal? Est-ce le noyau? Si c'est le noyau, pouvez-vous indiquer l'emplacement du fichier source qui gère cela?
Edit: je veux comprendre comment cela fonctionne dans un environnement graphique (X11) et textuel.
Réponses:
C'est le noyau. Gardez à l'esprit que le clavier est un matériel et que tout ce qui s'y passe passe par le noyau; dans le cas de la commutation VT, il gère l'événement entièrement lui-même et ne transmet rien à l'espace utilisateur (cependant, je pense qu'il existe un moyen lié à ioctl par lequel les programmes de l'espace utilisateur peuvent être avertis qu'un basculement se produit et peut éventuellement l'affecter, ce que X fait sans aucun doute).
Le noyau a un keymap intégré ; cela peut être modifié en cours d'exécution
loadkeys
et visualisé avecdumpkeys
:La source du noyau contient un fichier de keymap par défaut qui ressemble exactement à ceci; pour 3.12.2 c'est
src/drivers/tty/vt/defkeymap.map
. Vous remarquerez également qu’il existe un fichier defkeymap.c correspondant (qui peut être généré avecloadkeys --mktable
). Le traitement est danskeyboard.c
(tous ces fichiers sont dans le même répertoire) qui appelleset_console()
devt.c
:J'ai édité certains hits de cette liste; vous pouvez voir la signature de la fonction sur l'avant dernière ligne.
Donc, ce sont les choses impliquées dans la commutation. Si vous regardez la séquence des appels, vous revenez éventuellement
kbd_event()
àkeyboard.c
. Ceci est enregistré en tant que gestionnaire d'événements pour le module:(3.12.2
drivers/tty/vt/keyboard.c
ligne 1473)Par conséquent,
kbd_event()
devrait être appelé quand quelque chose monte du pilote matériel (probablement quelque chose dedrivers/hid/
oudrivers/input/
). Cependant, vous ne le verrez pas mentionné enkbd_event
dehors de ce fichier, car il est enregistré via un pointeur de fonction.Quelques ressources pour scruter le noyau
printk
lignes dans la source comme moyen simple de traçage (toutes les librairies standard C ne peuvent pas être utilisées dans le code du noyau, y compris printf from stdio). Les choses printk se retrouvent dans syslog.Wolfgang Mauerer a écrit un très grand livre sur l' architecture noyau Linux Linux 2.6 , qui utilise une grande partie de la source. Greg Kroah-Hartman , l’un des principaux développeurs de la dernière décennie, a aussi beaucoup de choses à raconter.
la source
keyboard.c
serait un gestionnaire d'événement; le "pilote de clavier" lui-même serait de niveau inférieur - il y en a des tasdrivers/input/keyboard/
pour des choses non-usb. Le contenu USB est normalisé, il n'y en aurait donc qu'un seul (impliquant probablementdrivers/hid/usbhid/usbkbd.c
). J'imagine que le pilote de clavier sert à produire un scancode qui peut être transmis à vt / keyboard.c (voir getkeycode () tout en haut).Documentation/input/input.txt
a quelques allusions (merveilleusement anciennes, lol).