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

Обработка прерываний с использованием 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.