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

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

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

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

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

в 8086 В процессоре таблица прерываний называется IVT (таблица векторов прерываний). IVT всегда находится в одном и том же месте в памяти, начиная с 0x0000 к 0x03ff, и состоит из 256 четырехбайтовых реальный режим дальние указатели (256 × 4 = 1024 байта памяти).

Указатель реального режима определяется как 16-битный сегмент и 16-битное смещение в этом сегменте. Сегмент внутренне расширяется процессором до 20 бит, сдвигая его на 4 бита влево, тем самым ограничивая обработчики прерываний реального режима первым 1 мегабайтом памяти. Первые 32 вектора зарезервированы для внутренних исключений процессора, а аппаратные прерывания могут быть отображены на любой из векторов с помощью программируемого контроллера прерываний.

На 80286 а позже размер и расположение IVT можно изменить так же, как это сделано с IDT в защищенный режим (то есть через инструкцию LIDT), хотя это не меняет ее формат. 80286 также представил область высокой памяти, что увеличивает ограничение адреса в реальном режиме на 65 520 байт.

Обычно используется прерывание реального режима x86: ИНТ 10H, то Видео BIOS код для обработки примитивных функций рисования экрана, таких как рисование пикселей и изменение разрешения экрана.

Защищенный режим

В защищенный режим, IDT - это массив дескрипторов, последовательно сохраняемых в памяти и индексированных вектором прерывания. Полностью заполненная IDT - 2 КБ в 32-битном защищенном режиме (256 записей по 8 байт каждая) длиной и 4 КБ. КБ в 64-битном защищенном режиме (256 записей по 16 байт каждая). Необязательно использовать все возможные записи: достаточно заполнить IDT до самого высокого используемого вектора прерывания и установить часть длины IDT для IDTR соответственно.

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

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

Векторы 0–31 зарезервированы Intel для исключений, генерируемых процессором (общая ошибка защиты, ошибка страницы, так далее.). В настоящее время процессоры Intel используют только векторы 0–20, а процессоры AMD используют векторы 0–19 и 29–30. Однако будущие процессоры могут создать несовместимость для сломанного программного обеспечения, которое использует эти векторы для других целей.

Аппаратные исключения

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

INT_NUMКраткое описание ВЕЧЕРА[требуется разъяснение ]
0x00Деление на ноль
0x01Одношаговое прерывание (см. флаг ловушки )
0x02НМИ
0x03Точка останова (вызывается специальной 1-байтовой инструкцией 0xCC, используемой отладчиками)
0x04Переполнение
0x05Границы
0x06Неверный код операции
0x07Сопроцессор недоступен
0x08Двойная ошибка
0x09Переполнение сегмента сопроцессора (Только 386 или ранее)
0x0AНедействительный сегмент состояния задачи
0x0BСегмент отсутствует
0x0CОшибка стека
0x0DОшибка общей защиты
0x0EОшибка страницы
0x0Fзарезервированный
0x10Математическая ошибка
0x11Проверка выравнивания
0x12Проверка машины
0x13SIMD Исключение с плавающей точкой
0x14Исключение виртуализации
0x15Исключение защиты управления

Крючок

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

Рекомендации

  1. ^ «Политика исправлений для систем на базе x64». Если операционная система обнаруживает одну из этих модификаций или любое другое неавторизованное исправление, она генерирует проверку на наличие ошибок и завершает работу системы.
Общий

внешняя ссылка