- •8. Прерывания и исключения
- •Прерывания и исключения защищенного режима
- •Приоритеты событий, вызывающих прерывания
- •Обработка прерываний в реальном режиме
- •Обработка прерываний в защищенном режиме
- •Возможности последовательной обработки исключений различных классов
- •Условия недостоверности сегмента tss
- •Приоритеты sse-исключений операций с плавающей точкой
- •Варианты обработки прерываний в режиме виртуального 8086
- •Виртуальные прерывания в режиме виртуального 8086
- •Обработка прерываний с использованием idt (защищенный режим)
- •Обработка прерываний с помощью таблицы векторов прерываний (реальный режим).
- •Обработка прерываний с использованием признаков vif и vip
Обработка прерываний с использованием 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.
