Це ядро. Майте на увазі, що клавіатура є апаратною, і все, що там відбувається, проходить через ядро; що стосується перемикання VT, він керує подією повністю сам і нічого не передає користувальницькому простору (однак, я вважаю, що є засоби, пов'язані з ioctl, за допомогою яких програми з користувацького простору можуть повідомляти про перемикання, що виникає в них, і, можливо, впливати на нього, що X без сумніву робить).
У ядрі є вбудована карта ключа ; це можна змінити під час запуску loadkeys
та переглядати за допомогою dumpkeys
:
[...]
keycode 59 = F1 F13 Console_13 F25
alt keycode 59 = Console_1
control alt keycode 59 = Console_1
keycode 60 = F2 F14 Console_14 F26
alt keycode 60 = Console_2
control alt keycode 60 = Console_2
keycode 61 = F3 F15 Console_15 F27
alt keycode 61 = Console_3
control alt keycode 61 = Console_3
[...]
Джерело ядра містить файл ключових карт за замовчуванням, який виглядає саме так; для 3.12.2 це src/drivers/tty/vt/defkeymap.map
. Ви також помітите, що є відповідний файл defkeymap.c (це може бути створено за допомогою loadkeys --mktable
). Обробка знаходиться в keyboard.c
(усі ці файли в одному каталозі), який дзвонить set_console()
зvt.c
:
» grep set_console *.c
keyboard.c: set_console(last_console);
keyboard.c: set_console(i);
keyboard.c: set_console(i);
keyboard.c: set_console(value);
vt.c:int set_console(int nr)
vt_ioctl.c: set_console(arg);
Я відредагував кілька звернень із цього списку; ви можете бачити підпис функції у другому останньому рядку.
Отже, це речі, які беруть участь у перемиканні. Якщо подивитися на послідовність викликів, в кінці кінців , ви повертаєтеся kbd_event()
в keyboard.c
. Це зареєстровано як обробник подій для модуля:
(3.12.2 drivers/tty/vt/keyboard.c
рядок 1473)
MODULE_DEVICE_TABLE(input, kbd_ids);
static struct input_handler kbd_handler = {
.event = kbd_event, <--- function pointer HERE
.match = kbd_match,
.connect = kbd_connect,
.disconnect = kbd_disconnect,
.start = kbd_start,
.name = "kbd",
.id_table = kbd_ids,
};
int __init kbd_init(void)
{
[...]
error = input_register_handler(&kbd_handler);
Отже, його kbd_event()
слід викликати, коли щось спливає від фактичного драйвера обладнання (можливо, щось із drivers/hid/
або drivers/input/
). Однак ви не будете бачити його як kbd_event
поза цим файлом, оскільки він реєструється через покажчик функції.
Деякі ресурси для перевірки ядра
- Linux Посилання Ідентифікатор Пошук є відмінним інструментом.
- Інтерактивна Linux Kernel Карта цікавий графічний інтерфейс для перехресних посилань інструменту.
- Є кілька історичних архівів масивного списку розсилки ядер Linux (LKML), який сягає щонайменше 1995 року; деякі з них не підтримуються та мають порушені функції пошуку, але, здається, gmanee працює дуже добре. Люди задавали багато питань у списку пошти, і це головний засіб спілкування серед розробників.
- Ви можете вводити власні
printk
рядки у джерело як простий засіб відстеження (не всі стандартні конверти C можуть використовуватися в коді ядра, включаючи printf від stdio). речі в стилі printk закінчуються в системі.
Вольфганг Маурер написав велику велику книгу про ядро 2.6, Професійна архітектура ядра Linux , де проходить багато джерела. Грег Кроах-Хартман , один із принципових розробок за останнє десятиліття, також багато чого б'є.