Драйвер клавиатуры
Драйвер клавиатуры — это системное программное обеспечение, обеспечивающее взаимодействие операционной системы (ОС) с физической клавиатурой или её виртуальным аналогом. Он преобразует электрические сигналы, возникающие при нажатии клавиш, в понятные для ОС и приложений коды (скан-коды), а также управляет параметрами ввода, такими как раскладка, скорость повторения и задержка. Драйвер является частью подсистемы ввода-вывода и работает на уровне ядра ОС или в пользовательском пространстве, в зависимости от архитектуры.
Функции и задачи
Основная функция драйвера клавиатуры — обеспечение корректного и своевременного ввода данных с клавиатуры. В число конкретных задач входят:
- Обработка скан-кодов. При нажатии клавиши клавиатура отправляет контроллеру уникальный скан-код, соответствующий физическому положению клавиши. Драйвер получает этот код и преобразует его в виртуальный код (например, в коды ASCII или Unicode) с учётом текущей раскладки и состояния модификаторов (Shift, Ctrl, Alt).
- Управление раскладкой. Драйвер отвечает за переключение между языковыми раскладками (например, русской и английской) и поддержку национальных символов. В современных ОС эта функция часто реализуется на уровне подсистемы ввода (Text Services Framework в Windows, Input Method в Linux).
- Настройка параметров ввода. Драйвер позволяет регулировать задержку перед началом автоповтора (repeat delay) и скорость автоповтора (repeat rate) при удержании клавиши. Эти настройки хранятся в реестре ОС или конфигурационных файлах.
- Поддержка мультимедийных и дополнительных клавиш. Современные клавиатуры оснащены дополнительными клавишами (регулировка громкости, запуск браузера, калькулятора). Драйвер обрабатывает их скан-коды и передаёт соответствующие команды в ОС или приложения.
- Эмуляция и виртуализация. Драйвер может эмулировать нажатия клавиш для программных клавиатур (например, экранная клавиатура в Windows) или для устройств, работающих через протоколы удалённого доступа (RDP, VNC).
Архитектура и уровни работы
Драйвер клавиатуры может работать на разных уровнях стека ввода-вывода ОС:
Драйверы уровня ядра
В операционных системах семейства Windows драйвер клавиатуры (kbdclass.sys) является драйвером класса, работающим на уровне ядра. Он взаимодействует с портовым драйвером (например, i8042prt.sys для PS/2-клавиатур или hidclass.sys для USB-клавиатур) через интерфейсы WDM (Windows Driver Model). Драйвер класса получает скан-коды от портового драйвера, преобразует их в виртуальные коды и передаёт в подсистему ввода (win32k.sys), которая распределяет события по приложениям.
В Linux драйвер клавиатуры реализован в виде модуля ядра (например, atkbd для PS/2 или usbhid для USB). Он обрабатывает прерывания от контроллера клавиатуры и помещает скан-коды в буфер. Затем подсистема ввода (input subsystem) преобразует их в события, которые передаются в пользовательское пространство через файлы устройств /dev/input/event*.
Драйверы пользовательского пространства
В некоторых ОС (например, в Android или встраиваемых системах) часть функций драйвера клавиатуры может быть реализована в пользовательском пространстве. Это позволяет упростить разработку и тестирование, но увеличивает задержки ввода. Примером является использование библиотеки libinput в Linux для обработки событий от клавиатур, подключённых через Bluetooth.
Фильтр-драйверы
Фильтр-драйверы клавиатуры (например, клавиатурные шпионы или программы для переназначения клавиш) встраиваются в стек драйверов между драйвером класса и портовым драйвером. Они могут перехватывать, модифицировать или блокировать скан-коды до их передачи в ОС. В Windows такие драйверы часто используются для реализации макросов или блокировки определённых клавиш.
Типы драйверов клавиатуры
Драйверы клавиатуры можно классифицировать по типу поддерживаемого оборудования и способу подключения:
- Драйверы для проводных клавиатур (PS/2, USB). Для PS/2-клавиатур используется стандартный протокол, определённый IBM. Драйвер работает через контроллер 8042. Для USB-клавиатур используется протокол HID (Human Interface Device), который поддерживает «горячее» подключение и передачу расширенных скан-кодов.
- Драйверы для беспроводных клавиатур (Bluetooth, RF). Беспроводные клавиатуры подключаются через Bluetooth-адаптер или собственный радиоприёмник. Драйвер должен обрабатывать пакеты данных, поступающие по беспроводному протоколу, и синхронизировать их с системным временем. В Windows для Bluetooth-клавиатур используется стек Bluetooth и драйвер hidbth.sys.
- Драйверы для специализированных клавиатур. Игровые клавиатуры, клавиатуры для ввода жестов (например, Apple Magic Keyboard) или клавиатуры с дополнительными функциями (подсветка, программируемые клавиши) требуют фирменных драйверов от производителя. Они часто включают утилиты для настройки подсветки и макросов.
- Драйверы виртуальных клавиатур. Используются в эмуляторах, терминалах и системах удалённого доступа. Они эмулируют нажатия клавиш на основе программных событий (например, из буфера обмена или сетевых пакетов).
История развития
Первые клавиатуры (например, у компьютеров IBM PC) использовали простой последовательный протокол, и драйвер был минимальным — он считывал скан-коды из порта 60h и помещал их в буфер BIOS. В MS-DOS драйвер клавиатуры (KEYB.COM) отвечал за переключение раскладки и поддержку национальных символов.
С появлением Windows 95 драйверы стали более сложными: появилась поддержка USB, мультимедийных клавиш и Plug and Play. В Windows 2000/XP была введена модель WDM, которая стандартизировала взаимодействие драйверов. В современных версиях Windows (10, 11) драйверы клавиатуры поддерживают сенсорные панели, биометрические датчики и голосовой ввод.
В Linux развитие драйверов клавиатуры шло параллельно: от простого keyboard.c в ранних версиях ядра до модульной подсистемы ввода, которая поддерживает сотни различных моделей клавиатур. С 2010-х годов активно используется библиотека libinput, которая унифицирует обработку ввода для X11 и Wayland.
Проблемы и безопасность
Драйверы клавиатуры могут быть источником уязвимостей. Кейлоггеры (программы для перехвата нажатий клавиш) часто реализуются в виде фильтр-драйверов, которые перехватывают скан-коды до их обработки системой. Для защиты от этого в современных ОС применяются механизмы подписи драйверов (Driver Signature Enforcement в Windows) и изоляция драйверов в защищённой памяти (Virtualization-Based Security).
Другая проблема — некорректная обработка «горячего» подключения USB-клавиатур, что может приводить к сбоям системы. Для решения этой проблемы драйверы должны корректно обрабатывать события подключения/отключения устройств и освобождать ресурсы.
Примеры драйверов
- Windows: kbdclass.sys (драйвер класса), i8042prt.sys (PS/2), hidclass.sys (USB HID), kbdhid.sys (HID-клавиатуры).
- Linux: atkbd (PS/2), usbhid (USB), hid-multitouch (сенсорные панели), libinput (пользовательский уровень).
- macOS: ApplePS2Keyboard (PS/2), AppleUSBKeyboard (USB), AppleHIDKeyboard (Bluetooth).
Источники
- Microsoft Docs. "Keyboard and Mouse Class Drivers". Windows Driver Kit (WDK).
- Linux Kernel Documentation. "Input Subsystem". kernel.org.
- Tanenbaum A., Bos H. "Modern Operating Systems". 4th edition. Pearson, 2014.
- Solomon D., Russinovich M. "Windows Internals". 7th edition. Microsoft Press, 2017.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →