Estou procurando uma explicação do que acontece no Linux quando essa combinação de teclas é pressionada para alterar o terminal atual. Em particular, qual componente de software intercepta essa combinação de teclas e altera o terminal? É o kernel? Se for o kernel, você poderia fornecer o local do arquivo de origem que lida com isso?
Edit: Eu quero entender como isso funciona em um ambiente gráfico (X11) e baseado em texto.
Respostas:
É o núcleo. Lembre-se de que o teclado é hardware e tudo o que acontece lá passa pelo kernel; no caso de comutação VT, ele lida com o evento completamente e não passa nada para o espaço do usuário (no entanto, acredito que exista um meio relacionado ao ioctl pelo qual os programas do espaço do usuário possam ser notificados sobre a ocorrência de um comutador que os envolva e talvez afetá-lo, que X sem dúvida faz).
O kernel possui um mapa de teclas incorporado; isso pode ser modificado durante a execução
loadkeys
e visualizado comdumpkeys
:A fonte do kernel contém um arquivo de mapa de teclas padrão que se parece exatamente com isso; para 3.12.2 é
src/drivers/tty/vt/defkeymap.map
. Você também notará que há um arquivo defkeymap.c correspondente (isso pode ser gerado comloadkeys --mktable
). A manipulação está emkeyboard.c
(todos esses arquivos estão no mesmo diretório) que chamaset_console()
devt.c
:Eu editei alguns hits dessa lista; você pode ver a assinatura da função na segunda última linha.
Portanto, essas são as coisas envolvidas na troca. Se você olhar para a seqüência de chamadas, eventualmente, você voltar a
kbd_event()
noskeyboard.c
. Isso é registrado como um manipulador de eventos para o módulo:(3.12.2,
drivers/tty/vt/keyboard.c
linha 1473)Portanto,
kbd_event()
deve ser chamado quando algo surgir do driver de hardware real (provavelmente algo dedrivers/hid/
oudrivers/input/
). No entanto, você não o verá comokbd_event
fora desse arquivo, pois é registrado por meio de um ponteiro de função.Alguns recursos para examinar o kernel
printk
linhas na fonte como um meio simples de rastrear (nem toda a biblioteca C padrão pode ser usada no código do kernel, incluindo printf do stdio). O material printk acaba no syslog.Wolfgang Mauerer escreveu um grande livro sobre o kernel 2.6, Professional Linux Kernel Architecture , que percorre grande parte da fonte. Greg Kroah-Hartman , um dos principais desenvolvedores da última década, também tem muitas coisas por aí.
fonte
keyboard.c
seria um manipulador de eventos; o "driver do teclado" em si seria de nível mais baixo - existem muitos delesdrivers/input/keyboard/
para itens não USB. O material USB é padronizado, portanto, haveria apenas um (provavelmente envolvendodrivers/hid/usbhid/usbkbd.c
). Estou supondo que o driver do teclado seja para produzir um scancode que possa ser entregue ao vt / keyboard.c (veja getkeycode () na parte superior).Documentation/input/input.txt
tem algumas dicas (maravilhosamente antigas, lol).