Таблица дескрипторов прерываний - Interrupt descriptor table

Таблицы дескрипторов прерываний ( IDT ) представляет собой структуру данных , используемой архитектуры x86 реализовать вектор прерывания таблицу. IDT используется процессором для определения правильного ответа на прерывания и исключения .

Подробности в описании ниже относятся конкретно к архитектуре x86 и архитектуре AMD64 . Другие архитектуры имеют аналогичные структуры данных, но могут вести себя по-другому.

Использование IDT запускается тремя типами событий: аппаратными прерываниями, программными прерываниями и исключениями процессора, которые вместе называются прерываниями . IDT состоит из 256 векторов прерываний, первые 32 из которых (0–31 или 0x00–0x1F) используются для исключений процессора.

Реальный режим

В реальном режиме таблица прерываний называется IVT (таблица векторов прерываний). Вплоть до 80286 IVT всегда располагался в одном и том же месте в памяти, в диапазоне от 0x0000до 0x03ff, и состоял из 256 дальних указателей . Аппаратные прерывания могут быть отображены на любой из векторов с помощью программируемого контроллера прерываний. На 80286 и более поздних версиях размер и расположение IVT могут быть изменены таким же образом, как это делается с IDT в защищенном режиме (т. Е. С помощью инструкции LIDT), хотя это не меняет его формат.

Прерывания BIOS

BIOS обеспечивает простой доступ в реальном режиме к подмножеству аппаратных средств путем регистрации обработчиков прерываний. Они вызываются как программные прерывания с помощью инструкции INT, а параметры передаются через регистры. Эти прерывания используются для различных задач, таких как определение структуры системной памяти , настройка вывода и режимов VGA , а также доступ к диску на ранней стадии процесса загрузки.

Защищенный и длительный режим

IDT - это массив дескрипторов, последовательно хранящихся в памяти и индексированных номером вектора. Нет необходимости использовать все возможные записи: достаточно заполнить таблицу до самого высокого используемого вектора прерывания и соответственно установить часть длины IDT IDTR.

Регистр IDTR используется для хранения как физического базового адреса, так и длины IDT в байтах. Когда происходит прерывание, процессор умножает вектор прерывания на размер записи (8 для защищенного режима, 16 для длительного режима) и добавляет результат к базовому адресу IDT. Если адрес находится внутри таблицы, DPL проверяется, и прерывание обрабатывается в зависимости от типа шлюза.

Дескрипторы могут быть либо шлюзами прерывания, либо шлюзами-ловушками, либо, только для 32-битного защищенного режима, шлюзами задач. Шлюзы прерывания и ловушки указывают на ячейку памяти, содержащую код для выполнения, указывая как сегмент (присутствующий в GDT или LDT ), так и смещение внутри этого сегмента. Единственное различие между шлюзами прерываний и прерываний состоит в том, что шлюзы прерываний отключают дальнейшую обработку процессором аппаратных прерываний, делая их пригодными для обработки аппаратных прерываний (и наоборот, шлюзы прерывания полезны для обработки программных прерываний и исключений). Шлюз задачи вызовет переключение текущего активного сегмента состояния задачи, используя аппаратный механизм переключения задач, чтобы эффективно передать использование процессора другой программе, потоку или процессу.

Исключения, создаваемые процессором

Все INT_NUM от 0x0 до 0x1F включительно зарезервированы для исключений; INT_NUM больше 0x1F используются для обработки прерываний. ( IBM PC не всегда подчинялся этому правилу, например, используя прерывание 5, чтобы указать, что была нажата клавиша Print Screen .)

INT_NUM Краткое описание PM
0x00 Деление на ноль
0x01 Одношаговое прерывание (см. Флаг прерывания )
0x02 НМИ
0x03 Точка останова (которая выигрывает от более короткой кодировки 0xCC INT 3)
0x04 Переполнение
0x05 Граничный диапазон превышен
0x06 Неверный код операции
0x07 Сопроцессор недоступен
0x08 Двойная ошибка
0x09 Переполнение сегмента сопроцессора (только 386 или более ранняя версия)
0x0A Недействительный сегмент состояния задачи
0x0B Сегмент отсутствует
0x0C Ошибка сегмента стека
0x0D Общая ошибка защиты
0x0E Ошибка страницы
0x0F зарезервированный
0x10 x87 Исключение с плавающей запятой
0x11 Проверка выравнивания
0x12 Проверка машины
0x13 Исключение SIMD с плавающей запятой
0x14 Исключение виртуализации
0x15 Исключение защиты управления (доступно только с CET )

Крючок

Некоторые программы Windows перехватывают вызовы IDT. Это включает в себя написание режима ядра драйвер , который перехватывает вызовы к IDT и добавляет в ее собственной обработке. Это никогда официально не поддерживалось Microsoft , но не было программно предотвращено в ее операционных системах до 64-разрядных версий Windows, где драйвер, пытающийся использовать ловушку режима ядра , заставит машину выполнять проверку ошибок .

использованная литература

Общий

внешние ссылки