Открыть сервис

Прерывание IRQ1

Прерывание IRQ1 — это аппаратное прерывание в архитектуре IBM PC-совместимых компьютеров, генерируемое контроллером клавиатуры (8042 или совместимым) при каждом нажатии или отпускании клавиши на клавиатуре. IRQ1 является одним из 15 стандартных аппаратных запросов прерываний (IRQ 0–15), используемых в системе для обработки событий от периферийных устройств. В современной вычислительной технике роль аппаратного прерывания IRQ1 часто эмулируется на уровне чипсета или операционной системы, однако концептуально оно остаётся ключевым механизмом взаимодействия пользователя с компьютером.

История

Происхождение IRQ1 связано с разработкой первой IBM PC (1981). В оригинальной архитектуре использовался контроллер прерываний Intel 8259A, который мог обрабатывать до 8 запросов (IRQ0–IRQ7). IRQ1 был закреплён за клавиатурой системным дизайном. При нажатии клавиши контроллер клавиатуры отправлял 8-битный скан-код, который через порт 0x60 передавался процессору, а также инициировал сигнал IRQ1. В более поздних системах (IBM PC/AT) второй контроллер 8259A расширил количество прерываний до 16, но IRQ1 остался на своём месте.

В 1990-х годах с распространением шины PCI и управления ACPI аппаратные прерывания стали маршрутизироваться более гибко, однако для обратной совместимости IRQ1 по-прежнему резервировался за клавиатурой. В современных материнских платах (типичные чипсеты Intel H610, B760 и AMD B650) физические линии IRQ1 не используются напрямую — клавиатура подключается через концентратор ввода-вывода (Super I/O) или USB, а прерывания эмулируются через контроллер APIC.

Принцип работы

Аппаратный уровень

При нажатии клавиши клавиатура отправляет скан-код (make code) в контроллер клавиатуры (обычно i8042 или встроенный в чипсет). Контроллер помещает скан-код в буфер (регистр порта 0x60) и генерирует сигнал IRQ1 на процессор. При отпускании клавиши отправляется скан-код отпускания (break code) — также с генерацией IRQ1, но с дополнительным байтом (например, 0xF0 для AT-клавиатур). Процессор, получив сигнал IRQ1, прерывает текущий поток команд и передаёт управление обработчику прерывания (обычно адрес которого хранится в таблице векторов прерываний по вектору 9 — 0x09 в режиме реального адреса или в соответствующем дескрипторе).

Программный уровень

В ранних операционных системах (MS-DOS) обработчик IRQ1 (INT 09h) читал скан-код из порта 0x60, преобразовывал его в ASCII-код и помещал в кольцевой буфер. Прикладное ПО получало символ через функции BIOS (INT 16h). В современных ОС (Windows, Linux) драйвер клавиатуры обрабатывает прерывание, преобразуя скан-коды в коды клавиш (key codes), которые затем передаются через подсистему ввода (Win32 API, evdev) приложениям.

Система прерываний и приоритеты

IRQ1 имеет приоритет 2 (в стандартной архитектуре 8259A). Более высоким приоритетом обладают IRQ0 (таймер) и IRQ2 (каскадный канал). После IRQ1 следуют IRQ3–IRQ7. Приоритет определяет, какое прерывание будет обслужено первым при одновременном возникновении нескольких. В системах с APIC (Advanced Programmable Interrupt Controller) приоритеты настраиваются более гибко, но по умолчанию клавиатурные прерывания по-прежнему имеют высокий приоритет.

Типичные проблемы и критика

Эффект «залипания» прерывания

В ранних ПК при некорректной работе обработчика или ошибках оборудования могло возникать непрерывное срабатывание IRQ1 (залипание клавиши), что блокировало другие прерывания. Решением была задержка на чтение статуса контроллера или сброс контроллера клавиатуры через порт 0x64.

Задержки ввода-вывода

Из-за последовательной обработки прерываний и привязки к скан-кодам в системах реального времени (например, игровых движках) могла возникать задержка между нажатием клавиши и реакцией приложения. В современных системах эту проблему решают через низкоуровневые методы опроса (polling) или использования выделенных очередей ввода (input queues) с минимальной задержкой.

Совместимость с USB

При переходе на USB-клавиатуры механизм IRQ1 перестал быть прямым: USB-устройства используют собственные запросы прерываний (через UHCI/EHCI/xHCI контроллеры). Для обеспечения обратной совместимости на уровне BIOS и ОС реализована эмуляция USB-клавиатуры как legacy-устройства с генерацией виртуального IRQ1 (через опцию «Legacy USB» в настройках системы). Однако при загрузке 64-битных ОС с UEFI эмуляция может отключаться, и прерывание IRQ1 обрабатывается только как виртуальный сигнал в рамках абстракции ACPI.

Примеры использования

Альтернативы и развитие

В высоконагруженных системах и встраиваемых решениях (например, Raspberry Pi) клавиатурный ввод обрабатывается через шину I²C или GPIO без использования архитектуры IBM PC. В консолях (Xbox, PlayStation) прерывания для контроллеров используют специализированные интерфейсы (например, XINPUT). В IBM PC-совместимой архитектуре IRQ1 остаётся для обратной совместимости, но в новых ОС (Windows 11) и UEFI-окружении ввод с клавиатуры всё чаще обрабатывается через драйверы без аппаратного прерывания IRQ1, хотя при загрузке в режиме совместимости (CSM) оно сохраняется.

Источники

  1. IBM Personal Computer Technical Reference (1981). IBM Corporation.
  2. Intel 8259A Programmable Interrupt Controller Datasheet (1988). Intel Corporation.
  3. «The Undocumented PC» by Frank van Gilluwe (1994). Addison-Wesley.
  4. «IBM PC/AT Technical Reference» (1984). IBM Corporation.
  5. ACPI Specification, Revision 6.5 (2022). UEFI Forum.
  6. Linux Kernel Source Code (arch/x86/kernel/irq.c, drivers/input/serio/i8042.c).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →