Введение

Таблица дескрипторов прерываний (IDT) — это структура данных, используемая архитектурой x86 для реализации таблицы векторов прерываний. IDT используется процессором для определения корректной реакции на прерывания и исключения. Детали, описанные ниже, относятся конкретно к архитектуре x86. Другие архитектуры могут иметь аналогичные структуры данных, но их поведение может отличаться. Обращение к 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 используется для хранения как линейного базового адреса, так и лимита (длина в байтах минус 1) IDT. При возникновении прерывания процессор умножает номер вектора прерывания на размер записи (8 для защищенного режима, 16 для длинного режима) и добавляет результат к базовому адресу IDT. Если адрес находится в пределах таблицы, проверяется DPL, и прерывание обрабатывается в зависимости от типа шлюза. Дескрипторы могут быть шлюзами прерываний, шлюзами ловушек или, только для 32-битного защищенного режима, шлюзами задач. Шлюзы прерываний и шлюзы ловушек указывают на местоположение в памяти, содержащее код для выполнения, определяя как сегмент (присутствующий в GDT или LDT), так и смещение внутри этого сегмента. Единственное различие между шлюзами ловушек и шлюзами прерываний заключается в том, что шлюзы прерываний отключают дальнейшую обработку процессором маскируемых аппаратных прерываний, что делает их подходящими для обработки аппаратных прерываний (в то время как шлюзы ловушек полезны для обработки программных прерываний и исключений). Шлюз задачи приводит к переключению текущего активного сегмента состояния задачи, используя аппаратный механизм переключения задач для эффективной передачи управления процессором другой программе, потоку или процессу.

Зацепка

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