Если на границе команды ожидают обработки более одного исключения или прерывания, то процессор обслуживает их в определенной, предсказуемой последовательности. Приоритеты внутри классов исключений и прерываний показаны в Таблице 9
Сначала процессор обслуживает отложенное исключение или прерывание из класса с высшим приоритетом, передавая выполненике первой команде соответствующего обработчика. Исключения с низшими прерываниями отменяются; прерывания с низшими приоритетами остаются подвешенными. Отмененные исключения затем генерируются снова, когда обработчик прерывания возвращает управление в точку прерывания.
Таблица дескрипторов прерываний
Таблица дескрипторов прерываний (IDT) ассоциирует каждый вектор исключения или прерывания с дескриптором процедуры или задачи, которая обслуживает соответствующее событие. Подобно таблицам GDT и LDT, IDT представляет собой массив 8-байтовых дескрипторов. В отличие от GDT, первый элемент IDT может содержать дескриптор. Для формирования индекса в IDT процессор умножает вектор исключения или прерывания на масштабный коэффициент восемь, т.е. число байтов дескриптора. Поскольку всего существует всего 256 векторов, IDT не может содержать более 256 дескрипторов. Она может содержать и менее 256 дескрипторов, поскольку дескрипторы требуются только для тех векторов прерывания, которые действительно могут иметь место в системе.
Таблица 9-2. Приоритеты одновременно произошедших исключений и прерываний-----------------------------------------------------------------Приоритет Описания-----------------------------------------------------------------Высший Исключения отладочных ловушек для последней команды (флаг TF установлен, бит T в TSS установлен, либо встречена контрольная точка данных) Исключения типа сбоя при отладке для следующей команды (контрольная точка для кода) Не-маскируемое прерывание Маскируемое прерывание Сбои при выборке следующей команды (Сбой "сегмент не присутствует" или сбой "общей защиты") Сбои при декодирования команды (Неверный код операции, слишком длинная команда или нарушение привилегированности) для команды WAIT, особая ситуация "Сопроцессор недоступен" (биты TS и MP регистра CR0 установлены) для команды ESC, особая ситуация "Сопроцессор недоступен" (биты EM или TS регистра CR установлены) для команд WAIT или ESC, Исключение "Ошибка в сопроцессоре" (сигнал на штырьке ошибки Error #) Сбои "Сегмент не присутствует", Сбои в стеке и сбои Общей защиты для операндов памяти Сбои Выравнивания для операндов памяти Низший Сбои страниц для операндов памяти-----------------------------------------------------------------
IDT может находиться в любой области физической памяти. Как показано на Рисунке 9-1, процессор находит IDT при помощи регистра IDTR. Этот регистр содержит как 32-разрядный базовый адрес, так и 16-разрядную границу IDT. Команды LIDT и SIDT выполняют загрузку и сохранение содержимого регистра IDTR. Обе команды работают с одним операндом, представляющим собой адрес в памяти шести байтов.
Если вектор ссылается на дескриптор вне заданной границы, процессор входит в режим закрытия. В этом режиме процессор прекращает выполнение команд до приема немаскируемого прерывания или сброса системы с последующей инициализацией. Процессор генерирует специальный цикл шины, указывающий на то, что он вошел в режим закрытия. Разработчикам программного обеспечения может понадобиться знать, как аппаратное обеспечение реагирует на данный сигнал. Например, аппаратное обеспечение может включать индикаторный светодиод на передней панели, генерировать немаскируемое прерывание для записи диагностической информации или выполнять инициализацию сброса системы.
Регистр IDTR47 16 15 0-----------------------------------------------------------------| Базовый адрес IDT | Граница IDT |----------------------------------------------------------------- | | | ------------------------- | | | | | \/ | ----- -------------------------- |---->| + |------->| Прерывание | | ----- |--- прерывание #N ----| | |------------------------| | | |------------------------| | | Шлюз для | | |--- прерывания #3 ----| | |------------------------| | | Шлюз для | | |--- прерывания #2 ----| | |------------------------| | | Шлюз для | ----------------->|--- прерывания #1 ----| -------------------------- Рисунок 9-1. Регистр IDTR определяет положение IDT в памяти
LIDT (Загрузить регистр IDT) загружает регистр IDTR базовым адресом и границей, находящимися в операнде памяти. Данная команда может быть выполнена только на CPL равном 0. Обычно она используется кодом инициализации операционной системы при создании IDT. Операционная система может также использовать ее для изменения с одной IDT на другую.
SIDT (Сохранить регистр IDT) копирует значения базового адреса и границы, хранимые в IDTR, в оперативную память. Эта команда может быть использована на любом уровне привилегированности.