Я ищу объяснение того, что происходит в Linux, когда эта комбинация клавиш нажимается для изменения текущего терминала. В частности, какой программный компонент перехватывает эту комбинацию клавиш и меняет терминал? Это ядро? Если это ядро, не могли бы вы указать расположение исходного файла, который обрабатывает это?
Редактировать: я хочу понять, как это работает как в графической (X11), так и в текстовой среде.
Ответы:
Это ядро. Имейте в виду, что клавиатура аппаратная, и все, что там происходит, проходит через ядро; в случае коммутации VT он полностью обрабатывает событие и ничего не передает в пользовательское пространство (однако, я полагаю, что существует средство, связанное с ioctl, с помощью которого пользовательские программы могут быть уведомлены о происходящем переключении с их участием и, возможно, повлиять на него, что X без сомнения делает).
Ядро имеет встроенную карту ключей ; это можно изменить во время работы с
loadkeys
и просмотреть с помощьюdumpkeys
:Исходный код ядра содержит файл раскладки ключей по умолчанию, который выглядит именно так; для 3.12.2 это
src/drivers/tty/vt/defkeymap.map
. Вы также заметите, что существует соответствующий файл defkeymap.c (он может быть создан с помощьюloadkeys --mktable
). Обработка находится вkeyboard.c
(все эти файлы находятся в одном каталоге), который вызываетset_console()
изvt.c
:Я отредактировал некоторые хиты из этого списка; вы можете увидеть сигнатуру функции во второй последней строке.
Таковы вещи, связанные с переключением. Если вы посмотрите на последовательность звонков, в конце концов вы вернетесь
kbd_event()
вkeyboard.c
. Это зарегистрировано как обработчик события для модуля:(3.12.2
drivers/tty/vt/keyboard.c
строка 1473)Следовательно,
kbd_event()
должен вызываться, когда что-то всплывает из фактического аппаратного драйвера (возможно, из-заdrivers/hid/
илиdrivers/input/
). Тем не менее, вы не увидите, что он называетсяkbd_event
вне этого файла, поскольку он зарегистрирован через указатель функции.Некоторые ресурсы для изучения ядра
printk
строки в исходный код как простое средство трассировки (не все стандартные библиотеки Cib могут использоваться в коде ядра, включая printf из stdio). материал printk заканчивается в системном журнале.Вольфганг Маурер (Wolfgang Mauerer) написал большую большую книгу о ядре 2.6, Professional Linux Kernel Architecture , которая содержит множество источников. Грег Кроа-Хартман , один из главных разработчиков за последнее десятилетие, также много чего знает.
источник
keyboard.c
будет обработчик событий; сам "драйвер клавиатуры" был бы более низкого уровня - есть куча из нихdrivers/input/keyboard/
для вещей, не относящихся к USB. USB материал стандартизирован, поэтому будет только один (вероятно, с участиемdrivers/hid/usbhid/usbkbd.c
). Я предполагаю, что драйвер клавиатуры предназначен для создания скан-кода, который можно передать в vt / keyboard.c (см. Getkeycode () вверху).Documentation/input/input.txt
имеет некоторые (удивительно древние, смеется) намеки.