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

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

Система прерываний — это механизм, обеспечивающий временное приостановление выполнения текущей программы микропроцессором для обработки некоторого события, после чего возобновляется прерванная работа. Система прерываний является ключевым компонентом архитектуры современных компьютеров, микроконтроллеров и встроенных систем, позволяя эффективно реагировать на внешние и внутренние сигналы без постоянного опроса (поллинга) состояния устройств.

История

Концепция прерываний возникла на ранних этапах развития вычислительной техники. Первые компьютеры, такие как ENIAC (1945), работали в режиме последовательного выполнения инструкций без возможности асинхронного реагирования на внешние события. Необходимость в прерываниях стала очевидной с появлением многозадачности и периферийных устройств, работающих медленнее процессора.

В 1950-х годах в компьютере UNIVAC I была реализована примитивная форма прерываний — «ловушки» (traps) для обработки ошибок. В 1961 году в машине IBM 7030 (Stretch) появилась полноценная система прерываний с аппаратной поддержкой приоритетов. Дальнейшее развитие связано с архитектурами IBM System/360 (1964), где прерывания стали стандартным механизмом взаимодействия процессора с периферией.

В микропроцессорах Intel 8080 (1974) и Zilog Z80 (1976) прерывания были реализованы через отдельные выводы INT и NMI. С появлением x86-совместимых процессоров (Intel 8086, 1978) система прерываний стала частью архитектуры IA-32, включающей таблицу векторов прерываний (IVT) и два программируемых контроллера прерываний (PIC) Intel 8259A.

Основные понятия и классификация

Типы прерываний

По источнику возникновения прерывания делятся на:

  • Аппаратные прерывания — генерируются внешними устройствами (клавиатура, мышь, жёсткий диск, таймер) или внутренними компонентами процессора (ошибка деления на ноль, переполнение стека). Аппаратные прерывания бывают маскируемыми (можно запретить обработку) и немаскируемыми (NMI — non-maskable interrupt, обрабатываются всегда, например, при сбое питания).
  • Программные прерывания — инициируются выполнением специальной инструкции в коде программы (например, INT в x86). Используются для вызова системных служб операционной системы (системные вызовы) или для отладки.
  • Исключения (exceptions) — синхронные события, возникающие внутри процессора при обнаружении аномалий в ходе выполнения инструкции (деление на ноль, нарушение защиты памяти, недопустимый код операции). Исключения делятся на отказы (faults), ловушки (traps) и аварийные завершения (aborts).

Векторы прерываний

Каждому прерыванию соответствует уникальный номер — вектор. Вектор указывает на адрес обработчика прерывания (interrupt handler) — специальной программы, которая выполняется при возникновении данного прерывания. В архитектуре x86 первые 32 вектора (0–31) зарезервированы для исключений и немаскируемых прерываний, остальные (32–255) используются для аппаратных и программных прерываний.

Приоритеты прерываний

Система прерываний поддерживает иерархию приоритетов. Если одновременно возникают несколько прерываний, процессор обрабатывает их в порядке убывания приоритета. Высокоприоритетное прерывание может прервать обработку низкоприоритетного (вложенные прерывания). Приоритеты задаются аппаратно (через контроллер прерываний) или программно (через маскирование).

Архитектура и компоненты

Контроллер прерываний

Для управления множеством источников прерываний используется программируемый контроллер прерываний (PIC — Programmable Interrupt Controller). В классической архитектуре IBM PC/AT применялись два каскадно-соединённых контроллера Intel 8259A, обслуживающих до 15 аппаратных прерываний (IRQ0–IRQ15). Каждому IRQ соответствует определённое устройство: IRQ0 — системный таймер, IRQ1 — клавиатура, IRQ6 — контроллер гибких дисков, IRQ14 — первичный канал ATA.

Современные системы (начиная с Intel 440BX, 1998) используют усовершенствованный программируемый контроллер прерываний (APIC — Advanced Programmable Interrupt Controller), встроенный в процессор и чипсет. APIC поддерживает до 255 векторов, распределение прерываний между несколькими процессорами (SMP — symmetric multiprocessing) и более гибкое управление приоритетами.

Таблица векторов прерываний

В реальном режиме работы x86-процессора таблица векторов прерываний (IVT) располагается в первых 1024 байтах оперативной памяти (адреса 0x00000–0x003FF) и содержит 256 записей по 4 байта (сегмент и смещение обработчика). В защищённом режиме используется таблица дескрипторов прерываний (IDT — Interrupt Descriptor Table), которая может располагаться в любом месте памяти; её адрес хранится в регистре IDTR.

Обработчик прерываний

Обработчик прерываний (ISR — Interrupt Service Routine) — это фрагмент кода, который выполняет необходимые действия при наступлении события: сохраняет контекст прерванной программы (регистры), обрабатывает прерывание (например, читает скан-код с клавиатуры), восстанавливает контекст и возвращает управление прерванной программе с помощью инструкции IRET (или IRETD в 32-битном режиме).

Механизм работы

Процесс обработки аппаратного прерывания включает следующие этапы:

  1. Возникновение запроса: внешнее устройство подаёт сигнал на соответствующий вход контроллера прерываний.
  2. Арбитраж приоритетов: контроллер определяет, является ли данное прерывание наивысшим по приоритету среди активных; если да — генерирует сигнал INTR (Interrupt Request) на процессор.
  3. Запрос прерывания: процессор завершает выполнение текущей инструкции, сохраняет в стеке флаги, регистр CS и указатель инструкции (EIP), а также сбрасывает флаг IF (Interrupt Flag), запрещая дальнейшие маскируемые прерывания на время обработки.
  4. Получение вектора: процессор посылает контроллеру сигнал подтверждения (INTA), и контроллер передаёт по шине данных номер вектора.
  5. Вызов обработчика: процессор по номеру вектора находит адрес обработчика в IVT/IDT и передаёт управление соответствующему коду.
  6. Обработка: ISR выполняет необходимые действия (сохраняет/восстанавливает контекст, взаимодействует с устройством).
  7. Возврат: инструкция IRET восстанавливает флаги, CS и EIP из стека, и процессор продолжает выполнение прерванной программы.

Применение

Система прерываний используется во всех современных вычислительных системах:

  • Операционные системы: прерывания таймера (IRQ0) используются для переключения задач (планировщик), прерывания от клавиатуры и мыши — для ввода, прерывания от жёсткого диска — для завершения операций ввода-вывода.
  • Встроенные системы: микроконтроллеры (AVR, ARM Cortex-M, PIC) используют прерывания для обработки сигналов с датчиков, таймеров, интерфейсов связи (UART, SPI, I²C).
  • Реального времени: системы с жёсткими временными ограничениями (авионика, промышленные контроллеры) полагаются на прерывания для гарантированного реагирования на события.
  • Отладка и мониторинг: программные прерывания (точки останова) позволяют отладчикам приостанавливать выполнение программы в заданных местах.

Проблемы и ограничения

  • Накладные расходы: сохранение/восстановление контекста и обработка прерывания занимают процессорное время. При высокой частоте прерываний (например, от сетевых карт на 10 Гбит/с) накладные расходы могут стать значительными.
  • Вложенные прерывания: неправильное управление приоритетами может привести к потере прерываний или к бесконечной рекурсии (стековый overflow).
  • Гонки данных: если обработчик прерывания и основной код обращаются к общим данным без синхронизации, возможны состояния гонки. Для защиты используются отключение прерываний (cli/sti в x86) или механизмы блокировок.
  • Маскирование: длительное маскирование прерываний (например, при выполнении критических секций) может привести к потере событий или снижению отзывчивости системы.

Современные тенденции

В современных процессорах (x86-64, ARMv8) система прерываний продолжает развиваться:

  • Message Signaled Interrupts (MSI): устройства передают прерывания в виде сообщений по шине PCI Express, что позволяет обойти ограничения по количеству линий IRQ и улучшить масштабируемость.
  • Interrupt Remapping: технология, позволяющая виртуализировать прерывания для гостевых операционных систем (Intel VT-d, AMD-Vi).
  • Polling vs Interrupts: в высокопроизводительных системах (сетевые адаптеры 100 Гбит/с) иногда выгоднее использовать режим опроса (NAPI в Linux) вместо прерываний, чтобы снизить накладные расходы.

Источники

  • Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide.
  • Andrew S. Tanenbaum, Herbert Bos. «Современные операционные системы» (4-е издание), 2015.
  • John L. Hennessy, David A. Patterson. «Компьютерная архитектура: количественный подход» (6-е издание), 2017.
  • «Программируемый контроллер прерываний Intel 8259A» — техническая документация Intel.
  • «The Linux Kernel Interrupts and Interrupt Handlers» — документация ядра Linux.

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

На главную BFOmetr →