- •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.