Estoy buscando una explicación de lo que sucede en Linux cuando se presiona esta combinación de teclas para cambiar el terminal actual. En particular, ¿qué componente de software intercepta esta combinación de teclas y cambia el terminal? ¿Es el núcleo? Si es el núcleo, ¿podría proporcionar la ubicación del archivo fuente que maneja esto?
Editar: Quiero entender cómo funciona esto en un entorno gráfico (X11) y basado en texto.
Respuestas:
Es el núcleo. Tenga en cuenta que el teclado es hardware y todo lo que sucede allí pasa a través del núcleo; en el caso del cambio de VT, maneja el evento completamente por sí mismo y no pasa nada al espacio de usuario (sin embargo, creo que hay un medio relacionado con ioctl por el cual los programas de espacio de usuario pueden ser notificados de un cambio que los involucra y tal vez lo afecte, que X sin duda lo hace).
El núcleo tiene un mapa de teclas incorporado; esto se puede modificar mientras se ejecuta con
loadkeys
y ver condumpkeys
:La fuente del núcleo contiene un archivo de mapa de teclas predeterminado que se ve exactamente así; para 3.12.2 es
src/drivers/tty/vt/defkeymap.map
. También notará que hay un archivo defkeymap.c correspondiente (esto se puede generar conloadkeys --mktable
). El manejo está enkeyboard.c
(todos estos archivos están en el mismo directorio) que llamaset_console()
desdevt.c
:Edité algunos éxitos de esa lista; Puede ver la firma de la función en la segunda última línea.
Estas son las cosas involucradas en el cambio. Si nos fijamos en la secuencia de llamadas, con el tiempo se llega de nuevo a
kbd_event()
enkeyboard.c
. Esto está registrado como un controlador de eventos para el módulo:(3.12.2
drivers/tty/vt/keyboard.c
línea 1473)Por lo tanto,
kbd_event()
debe llamarse cuando algo surge del controlador de hardware real (probablemente algo dedrivers/hid/
odrivers/input/
). Sin embargo, no verá que se mencionekbd_event
fuera de ese archivo, ya que está registrado a través de un puntero de función.Algunos recursos para escudriñar el núcleo
printk
líneas en la fuente como un medio simple de rastreo (no todas las C lib estándar se pueden usar en el código del kernel, incluido printf de stdio). El material printk termina en syslog.Wolfgang Mauerer escribió un gran libro sobre el kernel 2.6, Professional Linux Kernel Architecture , que abarca gran parte de la fuente. Greg Kroah-Hartman , uno de los principales desarrolladores de la última década, también tiene muchas cosas dando vueltas.
fuente
keyboard.c
sería un controlador de eventos; el "controlador del teclado" en sí mismo sería de nivel inferior: hay muchos de ellosdrivers/input/keyboard/
para cosas que no son usb. El material USB está estandarizado, por lo que solo habría uno (probablemente relacionadodrivers/hid/usbhid/usbkbd.c
). Supongo que el controlador del teclado es para producir un código de escaneo que se puede entregar a vt / keyboard.c (ver getkeycode () cerca de la parte superior de eso).Documentation/input/input.txt
tiene algunos (maravillosamente antiguos, jajaja) pistas.