Що відбувається при натисканні клавіші Ctrl + Alt + F <Num>?


38

Я шукаю пояснення того, що відбувається в Linux, коли ця комбінація клавіш натискається, щоб змінити поточний термінал. Зокрема, який програмний компонент перехоплює цю комбінацію клавіш і змінює термінал? Це ядро? Якщо це ядро, чи можете ви вказати місце розташування вихідного файлу, який обробляє це?

Редагувати: Я хочу зрозуміти, як це працює і в графічному (X11), і в текстовому середовищі.


1
Щоб уточнити, чи натискаєте ви ці клавіші під час X11 (тобто графічного сеансу) або на текстовій консолі? Відповідь різна.
дероберт

Відповіді:


36

Це ядро. Майте на увазі, що клавіатура є апаратною, і все, що там відбувається, проходить через ядро; що стосується перемикання 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 , де проходить багато джерела. Грег Кроах-Хартман , один із принципових розробок за останнє десятиліття, також багато чого б'є.


1
Дякую, саме це я шукав. Чи можете ви детальніше розповісти про те, що відбувається раніше в ланцюжку? Як називається код у клавіатурі.c, коли ми натискаємо Ctrl + Alt + F1? Клавіатура.c не є власне "драйвером клавіатури", чи не так?
user31765

1
Ні, я не думаю. Це все частина драйвера tty, для якого keyboard.cбув би обробник подій; сам "драйвер клавіатури" був би нижчим рівнем - їх є пучки drivers/input/keyboard/для не-usb-речей. USB-матеріали стандартизовані, тому буде лише одна (ймовірно, що стосується drivers/hid/usbhid/usbkbd.c). Я припускаю , що драйвер клавіатури для отримання скана , який може бути переданий на ЮТ / keyboard.c (див getkeycode () у верхній частині цього). Documentation/input/input.txtмає деякі (дивно давні, хаха) натяки.
goldilocks

PS. Багато розробників ядра знаходяться у списку електронних листів ядра Linux (LKML), який відкритий для загального користування, і якщо ви заперечуєте проти P & Qs тощо ( tux.org/lkml ), то варто довідатися там ... просто переконайтеся, що ви налаштуйте папку для неї одразу, є багато пошти.
goldilocks

При більш детальному огляді коду в клавіатурі.c є лише три незастарілих функції, які викликають set_console: fn_lastcons (), fn_dec_console () та fn_inc_console (). Один для переходу на останню консоль і один для переходу праворуч або ліворуч. Тому я досі не розумію, як викликається set_console (), коли ми натискаємо Ctrl + Alt + F <num>. Я припускаю, що ми повинні передати <num> як параметр set_console () десь. Я бачу, що set_console () з'являється і в vt_ioctl.c, але це не лише для ioctl з користувальницького простору, наприклад, з chvt? У моєму розумінні все ще є дірки.
user31765

1
У драйверах / приховано більше потенційно пов'язаних речей. Також помічайте "console_callback ()" у vt.c, який може перемикатись і реєструється вгорі через DECLARE_WORK. Це стосується планувальника: lxr.free-electrons.com/ident?i=DECLARE_WORK (цей інструмент перехресного посилання можна подати з makelinux.net/kernel_map, який може вам бути цікавим); Я припускаю, що це робить вид функції "головною петлею" для vt. Очевидно, що тут відсутнє посилання - це саме те, як проходять події на клавіатурі.
goldilocks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.