Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

Таблицы дескрипторов прерываний ( 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 прерываний реального режима является INT 10H, то Video 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, чтобы указать, что была нажата клавиша Print Screen .)

Подключение [ править ]

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

Ссылки [ править ]

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

Внешние ссылки [ править ]

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