- •8. Прерывания и исключения
- •Прерывания и исключения защищенного режима
- •Приоритеты событий, вызывающих прерывания
- •Обработка прерываний в реальном режиме
- •Обработка прерываний в защищенном режиме
- •Возможности последовательной обработки исключений различных классов
- •Условия недостоверности сегмента tss
- •Приоритеты sse-исключений операций с плавающей точкой
- •Варианты обработки прерываний в режиме виртуального 8086
- •Виртуальные прерывания в режиме виртуального 8086
- •Обработка прерываний с использованием idt (защищенный режим)
- •Обработка прерываний с помощью таблицы векторов прерываний (реальный режим).
- •Обработка прерываний с использованием признаков vif и vip
Приоритеты sse-исключений операций с плавающей точкой
Приоритет |
Описание |
1 (высший) |
Исключение неверной операции из-за операнда SNaN (или любого NaN операнда для операций максимума, минимума, сравнения и преобразования). |
2 |
Операнд1 QNaN. |
3 |
Любые другие исключения неверных операций, не упоминавшиеся выше и не исключение деления на ноль2. |
4 |
Денормализованный операнд2. |
5 |
Переполнение и потеря значимости, возможно в сочетании с исключением, уточняющим результат2. |
6 (низший) |
Исключение, уточняющее результат |
Пояснения к таблице:
Точнее QNaN это не исключение, просто обработка операнда QNaN предшествует исключениям с более низким приоритетам. Например, при делении QNaN на ноль, в результате получается QNaN, а не исключение деления на ноль.
Если замаскировано, то выполнение инструкции продолжается и может произойти исключение с более низким приоритетом.
$.3. Реализация и обслуживание виртуальных прерываний
При работе процессора в защищенном режиме возникает ряд проблем при организации обслуживания аппаратных и программных прерываний. Обычно обслуживание прерываний является функцией операционной системы. В защищенном режиме инструкции CLI, STI, изменяющие в регистре EFLAGS значение признака разрешения прерываний IF, выполняются только программами, имеющими уровень привилегий CPLIOPL. При установленном в регистре EFLAGS значении поля IOPL<3 разрешать или запрещать обслуживание маскированных прерываний могут только программы операционной системы, имеющие уровень привилегии CPL=0, 1 или 2. Поэтому обычно маскируемые запросы прерываний воспринимаются операционной системой, которая определяет, какой из программ пользователя адресован поступивший запрос прерывания. Если эта программа находится в стадии выполнения, то реализуется ее прерывание и обслуживание поступившего запроса.
Однако программы пользователя должны иметь возможность защитить себя от прерывания, так как прекращение или задержка некоторых выполняемых ими процедур может привести к нежелательным последствиям. Для решения этой проблемы в архитектуре IA-32 реализован механизм виртуальных прерываний. Этот механизм поддерживается в тех моделях процессоров, которые выполняют инструкцию CPUID.
Виртуальные прерывания в защищенном режиме
Поддержка виртуальных прерываний в защищенном режиме обеспечивается при значении бита CR4.PVI=1. Виртуальные прерывания реализуются только для программ, имеющих уровень привилегий CPL=3. При этом механизм виртуальных прерываний используется только при обслуживании маскируемых аппаратных прерываний пользователя, имеющих номера векторов n=32-255 (табл. $.1). Немаскируемые прерывания (NMI), программные прерывания и исключения обрабатываются обычным образом.
Для организации обслуживания виртуальных прерываний используются специальные признаки, введенные в регистр EFLAGS: VIF - признак разрешения обслуживания виртуального прерывания, VIP - признак поступившего запроса виртуального прерывания, обслуживание которого отложено.
Установка значения признака VIP=1 производится операционной системой в защищенном режиме, если внешний запрос маскируемого прерывания INTR=1 поступает при выполнении программ пользователя (низший уровень привилегии CPL=3) с запрещенным обслуживанием прерываний (значение IOPL<CPL). Обслуживание этого запроса разрешается при значении признака VIF=1, установка которого производится инструкцией STI.
Если CR0.PVI=1 (виртуальные прерывания разрешены), то при значениях CPL=3 и IOPL<3 выполнение инструкций CLI и STI не вызывает исключения типа #GP. В этом случае инструкции CLI и STI устанавливают соответствующее значение признака VIF=0 и VIF=1, не изменяя признак IF. Признак VIF запрещает или разрешает вызов подпрограммы обслуживания при поступлении запроса маскируемого аппаратного прерывания пользователя. Механизм виртуальных прерываний не оказывает влияние на выполнение инструкций PUSHF, POPF и IRET.
Виртуальные прерывания не реализуются, если значение бита PVI=0, или уровень привилегий программы CPL<3, или содержимое поля IOPL=3. В этом случае инструкции CLI и STI изменяют флаг IF, если CPL≤IOPL, или вызывают исключение #GP. если CPL>IOPL.
Если происходит маскируемое прерывание и прерывания разрешены (IF=1), то процессор с помощью таблицы IDT производит вызов обработчика прерывания, который проверяет значение признака EPLAGS.VIF. Если VIF=1 (для прерванной программы с уровнем CPL=3 разрешены маскируемые аппаратные прерывания), то обработчик выполняет обслуживание прерывания, после чего возвращает управление прерванной программе. Если VIF=0 (для прерванной программы с уровнем CPL=3 запрещены маскируемые аппаратные прерывания), то обработчик устанавливает значение признака VIP=1 (поступил запрос маскируемого аппаратного прерывания, но его обслуживание отложено) в хранящемся в стеке содержимом регистра EFLAGS и возвращает управление прерванной программе.
Когда программа пользователя (CPL=3) выполняет инструкцию STI, желая разрешить прерывания, действия процессора зависят от значения признака VIP:
Если VIP=0 (нет отложенных прерываний), то процессор устанавливает значение признака VIF=1 (разрешение виртуальных прерываний).
Если VIP=1 (есть отложенное прерывание), то процессор реализует исключение #GP. Вызываемая при этом подпрограмма обслуживания должна выполнить обработку отложенного прерывания. Перед возвратом из подпрограммы обслуживания необходимо установить значение признаков VIP=0 и VIF=1 в содержимом регистра EFLAGS, хранящемся в стеке.
