Szukam wyjaśnienia tego, co dzieje się w systemie Linux po naciśnięciu tej kombinacji klawiszy w celu zmiany bieżącego terminala. W szczególności, jaki komponent oprogramowania przechwytuje tę kombinację klawiszy i zmienia terminal? Czy to jądro? Jeśli jest to jądro, czy możesz podać lokalizację pliku źródłowego, który to obsługuje?
Edycja: Chcę zrozumieć, jak to działa zarówno w środowisku graficznym (X11), jak i tekstowym.
Odpowiedzi:
To jest jądro. Pamiętaj, że klawiatura jest sprzętem i wszystko, co się tam dzieje, przechodzi przez jądro; w przypadku przełączania VT obsługuje to zdarzenie całkowicie sam i nie przekazuje niczego do przestrzeni użytkownika (uważam jednak, że istnieją środki związane z ioctl, za pomocą których programy przestrzeni użytkownika mogą być powiadamiane o wystąpieniu przełączenia z nimi związanego i być może na to wpływają, co X bez wątpienia robi).
Jądro ma wbudowaną mapę klawiszy ; można to zmodyfikować podczas pracy z
loadkeys
i przeglądać za pomocądumpkeys
:Źródło jądra zawiera domyślny plik mapy klawiszy, który wygląda dokładnie tak; dla 3.12.2 to
src/drivers/tty/vt/defkeymap.map
. Zauważysz również, że istnieje odpowiedni plik defkeymap.c (można go wygenerowaćloadkeys --mktable
). Obsługa jest wkeyboard.c
(wszystkie te pliki znajdują się w tym samym katalogu), który wywołujeset_console()
zvt.c
:Zredagowałem niektóre hity z tej listy; możesz zobaczyć podpis funkcji w drugim ostatnim wierszu.
Są to rzeczy związane z przełączaniem. Jeśli spojrzeć na sekwencji połączeń, w końcu wrócisz do
kbd_event()
wkeyboard.c
. Jest to zarejestrowane jako moduł obsługi zdarzeń dla modułu:(3.12.2
drivers/tty/vt/keyboard.c
wiersz 1473)Dlatego
kbd_event()
powinien zostać wywołany, gdy coś wyskoczy z faktycznego sterownika sprzętowego (prawdopodobnie coś zdrivers/hid/
lubdrivers/input/
). Jednak nie zobaczysz go nazywanegokbd_event
poza tym plikiem, ponieważ jest on rejestrowany za pomocą wskaźnika funkcji.Niektóre zasoby do kontroli jądra
printk
linie do źródła jako prosty sposób śledzenia (nie wszystkie standardowe biblioteki C lib mogą być używane w kodzie jądra, w tym printf ze stdio). printk rzeczy kończy się w syslog.Wolfgang Mauerer napisał świetną dużą książkę o jądrze 2.6, Professional Linux Kernel Architecture , która przechodzi przez wiele źródeł. Greg Kroah-Hartman , jeden z głównych twórców ostatniej dekady, również ma wiele do zrobienia.
źródło
keyboard.c
byłby to moduł obsługi zdarzeń; sam „sterownik klawiatury” byłby na niższym poziomie - jest ich kilkadrivers/input/keyboard/
dla rzeczy innych niż USB. USB jest standaryzowany, więc byłby tylko jeden (prawdopodobnie obejmującydrivers/hid/usbhid/usbkbd.c
). Zgaduję, że sterownik klawiatury służy do tworzenia skancodu, który można przekazać do vt / keyboard.c (patrz getkeycode () u góry tego).Documentation/input/input.txt
ma pewne (cudownie starożytne, lol) wskazówki.