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

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

Таблица векторов прерываний — это структура данных, используемая в вычислительной технике, которая содержит адреса (векторы) программ-обработчиков прерываний. Она служит связующим звеном между аппаратным или программным сигналом прерывания и кодом, который должен быть выполнен в ответ на этот сигнал. Таблица векторов прерываний является ключевым элементом архитектуры многих процессоров, включая x86 (Intel, AMD) и некоторые микроконтроллеры, и позволяет системе эффективно и предсказуемо реагировать на события, требующие немедленного внимания.

История и происхождение

Концепция таблицы векторов прерываний возникла с развитием микропроцессорной техники и необходимостью стандартизировать обработку внешних и внутренних событий. В ранних компьютерах, таких как IBM System/360, использовались более сложные механизмы, но с появлением 8-битных и 16-битных процессоров, таких как Intel 8080 и Intel 8086, таблица векторов прерываний стала стандартным решением.

В архитектуре x86, начиная с процессора Intel 8086, таблица векторов прерываний была фиксированной и располагалась в самом начале адресного пространства — от 0x0000 до 0x03FF (первые 1024 байта). Каждый вектор занимал 4 байта (2 байта на сегмент и 2 байта на смещение), что позволяло адресовать до 256 различных прерываний (0–255). Эта структура оставалась неизменной вплоть до появления процессора Intel 80386, когда была введена более гибкая система — таблица дескрипторов прерываний (IDT). Однако в защищённом режиме IDT может быть расположена в любом месте памяти, а её размер и формат записей (8 байт на вектор) отличаются от реального режима.

Структура и формат

В реальном режиме (x86)

В реальном режиме работы процессора x86 таблица векторов прерываний представляет собой массив из 256 записей, каждая из которых состоит из двух 16-битных полей:

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

Адрес обработчика вычисляется как (Segment << 4) + Offset. Таблица располагается по адресу 0x0000:0x0000 (физический адрес 0x00000) и занимает 1024 байта (256 × 4).

В защищённом режиме (x86)

В защищённом режиме и в режиме long mode (64-бит) используется таблица дескрипторов прерываний (Interrupt Descriptor Table, IDT). Каждая запись IDT имеет размер 8 байт (в 32-битном режиме) или 16 байт (в 64-битном режиме) и содержит:

  • Базовый адрес обработчика (16 или 32 бита в зависимости от режима).
  • Селектор сегмента (16 бит) — указывает на сегмент кода, в котором находится обработчик.
  • Тип шлюза (Gate Type) — определяет, является ли прерывание аппаратным (Interrupt Gate), программным (Trap Gate) или исключением (Task Gate).
  • Уровень привилегий (DPL) — минимальный уровень привилегий, необходимый для вызова обработчика.
  • Флаг присутствия (Present) — указывает, действителен ли обработчик.

IDT может быть расположена в любом месте физической памяти; её базовый адрес и размер хранятся в специальном регистре IDTR (Interrupt Descriptor Table Register). Размер IDT ограничен 256 записями, но может быть меньше.

Классификация прерываний

Прерывания, обрабатываемые через таблицу векторов, делятся на несколько категорий:

Аппаратные прерывания

Генерируются внешними устройствами (клавиатура, мышь, жёсткий диск, таймер) через контроллер прерываний (например, Intel 8259A или APIC). В реальном режиме они обычно занимают векторы с 0x08 по 0x0F (IRQ0–IRQ7) и с 0x70 по 0x77 (IRQ8–IRQ15). В защищённом режиме эти векторы могут быть переназначены.

Программные прерывания

Вызываются инструкцией INT в коде программы. Например, в MS-DOS прерывание INT 0x21 использовалось для вызова функций операционной системы. Программные прерывания могут быть использованы для системных вызовов, отладки или эмуляции.

Исключения (Exceptions)

Генерируются процессором при возникновении ошибок или особых ситуаций:

  • Faults — ошибки, которые могут быть исправлены (например, страничное нарушение, деление на ноль).
  • Traps — события, возникающие после выполнения инструкции (например, точки останова).
  • Aborts — серьёзные ошибки, после которых выполнение программы невозможно (например, аппаратный сбой).

В архитектуре x86 исключения занимают векторы с 0x00 по 0x1F (первые 32 вектора). Например:

  • 0x00 — деление на ноль (Division Error).
  • 0x03 — точка останова (Breakpoint).
  • 0x0E — страничное нарушение (Page Fault).
  • 0x13 — ошибка сегментации (General Protection Fault).

Применение

Операционные системы

Таблица векторов прерываний является основой для работы операционных систем. При загрузке ОС (например, Windows, Linux или MS-DOS) она инициализирует IDT, назначая обработчики для каждого прерывания. Это позволяет:

  • Обрабатывать нажатия клавиш и движения мыши.
  • Управлять таймерами и многозадачностью.
  • Реагировать на ошибки памяти и деления на ноль.
  • Реализовывать системные вызовы (например, через INT 0x80 в Linux или syscall в Windows).

Микроконтроллеры

В микроконтроллерах (например, семейства ARM Cortex-M, AVR, PIC) таблица векторов прерываний также используется, но её формат может отличаться. В ARM Cortex-M таблица содержит не только адреса обработчиков, но и начальное значение указателя стека. Векторы обычно располагаются в начале памяти программ (например, по адресу 0x00000000).

Эмуляция и виртуализация

В эмуляторах и гипервизорах (например, QEMU, VMware) таблица векторов прерываний эмулируется для обеспечения совместимости с гостевыми операционными системами. Гостевая ОС может модифицировать IDT, а гипервизор перехватывает определённые прерывания для управления ресурсами.

Примеры

В MS-DOS (реальный режим)

  • INT 0x10 — видеосервис (вывод символов на экран).
  • INT 0x13 — дисковый сервис (чтение/запись секторов).
  • INT 0x21 — системные вызовы MS-DOS (открытие файлов, вывод строки).

В Linux (защищённый режим)

  • INT 0x80 — системный вызов (устаревший, заменён на syscall в x86-64).
  • 0x0E (Page Fault) — обработка страничных нарушений для реализации виртуальной памяти.
  • 0x00 (Division Error) — обработка арифметических ошибок.

В Windows (32-битный режим)

  • IDT содержит обработчики для аппаратных прерываний (например, IRQ0 — таймер, IRQ1 — клавиатура) и исключений (например, #GP — общая защита).
  • Системные вызовы реализованы через INT 0x2E (устаревший) или sysenter/syscall.

Критика и ограничения

  • Фиксированный размер: В реальном режиме таблица занимает 1024 байта, что может быть избыточно для простых систем или недостаточно для сложных.
  • Уязвимость безопасности: В реальном режиме таблица находится в оперативной памяти и может быть модифицирована вредоносным кодом. В защищённом режиме это частично решается через защиту страниц и привилегии.
  • Сложность настройки: В защищённом режиме инициализация IDT требует знания селекторов сегментов и уровней привилегий, что усложняет разработку низкоуровневого ПО.
  • Несовместимость режимов: Таблица реального режима несовместима с защищённым режимом, что требует переключения режимов или использования эмуляции.

Интересные факты

  • В процессорах Intel 8086 таблица векторов прерываний была единственным способом обработки прерываний, и её расположение в начале памяти делало её уязвимой для переполнения буфера.
  • В архитектуре ARM Cortex-M таблица векторов прерываний содержит не только адреса обработчиков, но и начальное значение указателя стека, что ускоряет инициализацию.
  • В некоторых микроконтроллерах (например, PIC) таблица векторов прерываний может быть расположена в ПЗУ, что делает её неизменяемой.
  • В современных процессорах x86-64 IDT может содержать до 256 записей, но на практике используется только часть из них (обычно первые 32 для исключений и 16 для аппаратных прерываний).

Источники

  • Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A: System Programming Guide.
  • «Архитектура компьютера» — Э. Таненбаум, Т. Остин.
  • «Программирование на языке ассемблера для IBM PC» — П. Абель.
  • «Операционные системы: внутреннее устройство и принципы проектирования» — У. Столлингс.
  • Техническая документация ARM Cortex-M3/M4.

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

На главную BFOmetr →