Таблица дескрипторов прерываний - 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, где драйвер, пытающийся использовать ловушку режима ядра , заставит машину выполнять проверку ошибок .
использованная литература
- Общий
внешние ссылки
- Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 3A: Руководство по системному программированию, часть 1 (см. ГЛАВУ 5, УПРАВЛЕНИЕ ПРЕРЫВАНИЯМИ И ИСКЛЮЧЕНИЯМИ и ГЛАВУ 10, РАСШИРЕННЫЙ ПРОГРАММИРУЕМЫЙ КОНТРОЛЛЕР ПРЕРЫВАНИЯ)]
- Таблица дескрипторов прерываний на OSDev.org