Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M5 / Прерывания и исключения.doc
Скачиваний:
49
Добавлен:
16.04.2013
Размер:
238 Кб
Скачать
☆

Обработка прерываний с использованием idt (защищенный режим)

Когда прерывание обрабатывается через шлюз ловушки или шлюз, прерывания, то этот шлюз должен ссылаться на неподчиненный сегмент кода с уровнем приоритета DPL=0. Если шлюз ссылается на подчиненный сегмент или сегмент с уровнем приоритета DPL>0, то реализуется исключение #GP. В качестве кода ошибки при этом указывается селектор сегмента, на который ссылается шлюз.

При передаче управления подпрограмме обработки прерываний процессор выполняет следующие действия:

  • Переключается в защищенный режим с уровнем привилегий 0.

  • Сохраняет в стеке с уровнем привилегий 0 содержимое регистров GS, FS, DS, ES, SS, ESP, EFLAGS, CS, EIP и, если надо, код ошибки (рис. $.4)

  • Очищает сегментные регистры GS, FS, DS и ES.

  • Устанавливает в регистре EFLAGS значение признака VM=0.

  • Начинает выполнение подпрограммы обработки прерывания.

Стек PL0

<— ESP до передачи управления обработчику прерывания

GS

FS

DS

ES

SS

ESP

EFLAGS

CS

ЕIP

Код ошибки

<— ESP после передачи управления обработчику прерывания

Рис. $.4. Использование стека при прерываниях в режиме виртуального 8086

Подпрограмма обработки прерывания может проверять значение признака VM в регистр EFLAGS, содержимое которого хранится в стеке, чтобы определить, выполнялась ли прерванная программа в виртуальном режиме.

При выполнении инструкции возврата из подпрограммы обработки прерывания ее текущий уровень привилегий должен иметь значение CPL=0, иначе инструкция IRET не сможет изменить признак VM.

Когда прерывание обрабатывается через шлюз задачи, то процессор выполняет обычную процедуру переключения задач:

  • Содержимое регистра EFLAGS (с установленным признаком VM=1) сохраняется в сегменте TSS текущей задачи.

  • В поле обратной связи сегмента SS программы-обработчика прерывания загружается селектор сегмента TSS прерванной задачи.

  • Содержимое регистра EFLAGS, в котором устанавливается значение признак VM=0, загружается из сегмента TSS программы-обработчика.

  • В регистре EFLAGS устанавливается значение признака вложенной задачи NT=1.

  • Начинается выполнение подпрограммы обслуживания прерывания.

По инструкции IRET произойдет обратное переключение задач. При этом подпрограмма обслуживания должна иметь уровень CPL=0, иначе инструкция IRET не изменит состояние признака VM.

Обработка прерываний с помощью таблицы векторов прерываний (реальный режим).

В этом случае обработка прерывания осуществляется без выхода из виртуального режима. Вызов программы-обработчика производится с помощью таблицы векторов прерываний, которая хранится по линейному адресу 0...0h. Процессор производит следующую последовательность действий:

Если IOPL=3:

  • Сохраняется в стеке содержимое регистра FLAGS, в котором устанавливается значение признака NT=0 и поля IOPL=0.

  • Сохраняется в стеке текущее содержимое регистров CS и IP.

  • В регистре EFLAGS устанавливается значение признаков IF=0 (маскируемые прерывания запрещаются) и TF=0.

  • Из таблицы векторов прерываний загружается новое содержимое регистров CS и IP (в старшее слово регистра ЕIР заносится 0).

  • Начинается выполнение подпрограммы обработки прерывания

Если IOPL<3:

  • Сохраняется в стеке содержимое регистра FLAGS, в котором устанавливаются значения поля IOPL=3 и признака IF, равное значению признака VIF.

  • Сохраняет в стеке текущее содержимое регистров CS и IP.

  • В регистре EFLAGS устанавливаются значения признаков VIF=0 и TF=0.

  • Из таблицы векторов прерываний загружается новое содержимое реги­стров CS и IР (в старшее слово регистра ЕIР заносится 0)

  • Начинается выполнение подпрограммы обработки прерывания.

Возврат из подпрограммы обработки прерывания выполняется, как обычно, с помощью инструкции IRET. При этом инструкция IRET не восстанавливает содержимое поля IOPL, так как ее уровень приоритета CPL≠0.