INT 09h
INT 09h — это программное прерывание (interrupt) в архитектуре x86, используемое в операционных системах DOS и ранних версиях Windows для обработки аппаратных прерываний от клавиатуры. Оно является частью системы прерываний BIOS (Basic Input/Output System) и предназначено для взаимодействия между клавиатурным контроллером и центральным процессором, обеспечивая преобразование скан-кодов клавиш в символы и управление буфером ввода.
История и происхождение
Прерывание INT 09h было введено в IBM PC/XT в 1981 году как часть стандартной BIOS, разработанной компанией IBM. В то время клавиатура подключалась через контроллер Intel 8255A (или аналогичный), который генерировал аппаратное прерывание IRQ1 (Interrupt Request 1) при нажатии или отпускании клавиши. Обработчик этого прерывания, реализованный в BIOS, вызывался через вектор 09h (девятнадцатый в таблице векторов прерываний, где каждый вектор занимает 4 байта — адрес сегмента и смещения). Название «INT 09h» происходит от шестнадцатеричного номера прерывания (09h = 9 в десятичной системе).
С развитием архитектуры x86, особенно с появлением защищённого режима в процессорах 80286 и выше, роль INT 09h изменилась. В реальном режиме (используемом в DOS) оно оставалось основным механизмом ввода с клавиатуры, тогда как в защищённом режиме (например, в Windows 3.1 или Linux) обработка клавиатуры была перенесена на уровень драйверов операционной системы, а INT 09h стало использоваться реже или эмулироваться.
Устройство и принцип работы
Аппаратная основа
Клавиатура, подключённая к компьютеру, генерирует скан-коды — уникальные числовые значения, соответствующие каждой клавише. При нажатии клавиши контроллер клавиатуры (например, Intel 8042) отправляет скан-код нажатия (make code), а при отпускании — скан-код отпускания (break code), который обычно равен скан-коду нажатия плюс 80h (128 в десятичной системе). Контроллер генерирует сигнал IRQ1, который поступает на программируемый контроллер прерываний (PIC, Intel 8259A). PIC, в свою очередь, инициирует вызов INT 09h.
Программная обработка
Обработчик INT 09h, расположенный в BIOS, выполняет следующие шаги:
- Чтение скан-кода: из порта клавиатуры (обычно порт 60h) считывается текущий скан-код.
- Преобразование: скан-код преобразуется в ASCII-символ или управляющий код (например, Backspace, Enter) с учётом состояния клавиш-модификаторов (Shift, Ctrl, Alt, Caps Lock). Для этого используется таблица трансляции, хранящаяся в BIOS.
- Запись в буфер: полученный символ помещается в кольцевой буфер клавиатуры (обычно размером 16 или 32 байта), расположенный в оперативной памяти. Если буфер заполнен, символ отбрасывается (генерируется звуковой сигнал).
- Завершение: обработчик отправляет сигнал подтверждения (End of Interrupt, EOI) контроллеру прерываний через порт 20h, разрешая дальнейшие прерывания.
Взаимодействие с INT 16h
INT 09h работает в паре с другим прерыванием — INT 16h (сервис клавиатуры BIOS). Если INT 09h отвечает за аппаратную часть (чтение скан-кодов и заполнение буфера), то INT 16h используется программами для извлечения символов из буфера. Например, вызов INT 16h с функцией 00h (читать следующий символ) ожидает, пока в буфере появится символ, и возвращает его в регистре AL (ASCII-код) и AH (скан-код). Таким образом, INT 09h — это низкоуровневый обработчик, а INT 16h — интерфейс для прикладного ПО.
Классификация и виды
INT 09h относится к классу аппаратных прерываний (аппаратные прерывания генерируются внешними устройствами, в отличие от программных, вызываемых инструкцией INT). В рамках системы прерываний x86 оно является частью векторов, зарезервированных для BIOS (векторы 00h–1Fh). В зависимости от режима работы процессора выделяют:
- Реальный режим (Real Mode): INT 09h используется напрямую, обработчик находится в BIOS. Это характерно для DOS, FreeDOS, а также для загрузчиков операционных систем (например, GRUB в начальной фазе).
- Защищённый режим (Protected Mode): в современных ОС (Windows, Linux) INT 09h перехватывается операционной системой. ОС заменяет вектор прерывания на собственный обработчик, который может выполнять более сложные действия (например, поддержка мультимедийных клавиш, раскладок клавиатуры, эмуляция для виртуальных машин). В этом случае оригинальный обработчик BIOS может вызываться для обратной совместимости.
- Виртуальный режим (Virtual 8086 Mode): в 32-битных версиях Windows (например, Windows 95/98) для запуска DOS-приложений использовался виртуальный 8086-режим, где INT 09h эмулировалось через виртуальные драйверы (VxD, Virtual Device Driver).
Применение и значение
В операционных системах
INT 09h является основой для ввода с клавиатуры в DOS. Без него невозможно было бы обрабатывать нажатия клавиш в текстовых редакторах (например, Norton Commander, MS-DOS Editor), играх (Doom, Wolfenstein 3D) и других программах, работающих в реальном режиме. В современных ОС, хотя INT 09h не используется напрямую, его концепция легла в основу драйверов клавиатуры, которые обрабатывают IRQ1.
В разработке ПО
Программисты, работающие с ассемблером x86, часто используют INT 09h для создания собственных обработчиков клавиатуры. Например, можно перехватить вектор прерывания (изменить адрес в таблице векторов) и реализовать альтернативную обработку скан-кодов, что позволяет:
- Создавать «горячие клавиши» для переключения раскладок.
- Реализовывать макросы (автоматическое нажатие последовательности клавиш).
- Блокировать определённые клавиши (например, Caps Lock).
- Обрабатывать нестандартные клавиатуры (например, с дополнительными кнопками).
В эмуляции и виртуализации
Эмуляторы (DOSBox, QEMU, VirtualBox) эмулируют INT 09h для обеспечения совместимости с DOS-программами. В виртуальных машинах, работающих под управлением гипервизоров (VMware, Hyper-V), INT 09h может быть перехвачено и обработано хост-системой, что позволяет вводить текст с физической клавиатуры в гостевую ОС.
Примеры использования
Простой обработчик на ассемблере
Ниже приведён пример перехвата INT 09h для вывода скан-кода на экран (для DOS, реальный режим):
```assembly ; Сохраняем старый вектор mov ax, 3509h ; Функция 35h INT 21h — получить вектор int 21h mov word ptr old_int09, bx mov word ptr old_int09+2, es
; Устанавливаем новый вектор mov ax, 2509h ; Функция 25h INT 21h — установить вектор mov dx, seg new_int09 mov ds, dx mov dx, offset new_int09 int 21h
; ... (основная программа)
new_int09: push ax push dx in al, 60h ; Читаем скан-код из порта 60h mov ah, 0Eh ; Функция INT 10h — вывод символа (телетайп) int 10h ; Выводим скан-код как символ (некорректно, но для примера) mov al, 20h ; EOI out 20h, al pop dx pop ax iret ; Возврат из прерывания ```
Этот код демонстрирует базовую структуру: чтение скан-кода, отправка EOI и возврат. В реальных приложениях требуется более сложная логика (преобразование в ASCII, работа с буфером).
Перехват в Windows 9x
В Windows 95/98 INT 09h могло быть перехвачено через виртуальный драйвер (VxD) для поддержки мультимедийных клавиш. Например, драйвер keyboard.vxd обрабатывал скан-коды, которые не поддерживались BIOS (например, клавиши «Веб-браузер» или «Почта»).
Критика и ограничения
INT 09h имеет ряд недостатков, которые стали очевидны с развитием вычислительной техники:
- Ограниченный буфер: кольцевой буфер BIOS размером 16–32 байта может переполняться при быстром вводе, что приводит к потере символов. В современных ОС эта проблема решается использованием больших буферов на уровне драйверов.
- Отсутствие поддержки Unicode: INT 09h работает только с ASCII-символами (до 255 кодов). Для ввода символов кириллицы, иероглифов или других языков требовались дополнительные программы (например, переключатели раскладок, такие как
keyrus.comв DOS). - Зависимость от реального режима: в защищённом режиме INT 09h не может быть вызвано напрямую из-за различий в механизмах обработки прерываний (таблица векторов заменяется на IDT, Interrupt Descriptor Table). Это делает его бесполезным для современных 64-битных ОС без эмуляции.
- Проблемы с многозадачностью: в многозадачных средах (например, Windows 3.1) несколько программ могли одновременно пытаться обработать INT 09h, что приводило к конфликтам. Решением стало перехват прерывания операционной системой и распределение событий через очереди сообщений.
Интересные факты
- В ранних версиях IBM PC (до 1983 года) обработчик INT 09h не поддерживал клавишу
SysRq(System Request), которая позже стала использоваться в Linux для аварийного выхода (Magic SysRq). - Некоторые вирусы для DOS (например, «Cascade» или «Jerusalem») перехватывали INT 09h, чтобы скрыть своё присутствие или перехватывать ввод паролей.
- В эмуляторе DOSBox INT 09h эмулируется с задержкой, что может вызывать проблемы в играх, чувствительных к таймингам (например, в старых шутерах от первого лица).
- В операционной системе FreeDOS существует возможность замены стандартного обработчика INT 09h на собственный, написанный на C, что позволяет расширить функциональность (например, поддержка USB-клавиатур).
Источники
- IBM PC/XT Technical Reference Manual (1983)
- Intel 8259A Programmable Interrupt Controller Datasheet (1988)
- «The Undocumented PC» by Frank van Gilluwe (1994)
- «DOS Internals» by Geoff Chappell (1996)
- FreeDOS Keyboard Driver Documentation (2002)
- OSDev Wiki: Interrupts and Keyboard (2020)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →