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

Приоритеты sse-исключений операций с плавающей точкой

Приоритет

Описание

1 (высший)

Исключение неверной операции из-за операнда SNaN (или любого NaN операнда для операций максимума, минимума, сравнения и преобразования).

2

Операнд1 QNaN.

3

Любые другие исключения неверных операций, не упоминавшиеся выше и не исключение деления на ноль2.

4

Денормализованный операнд2.

5

Переполнение и потеря значимости, возможно в сочетании с исключением, уточняющим результат2.

6 (низший)

Исключение, уточняющее результат

Пояснения к таблице:

  1. Точнее QNaN это не исключение, просто обработка операнда QNaN предшествует исключениям с более низким приоритетам. Например, при делении QNaN на ноль, в результате получается QNaN, а не исключение деления на ноль.

  2. Если замаскировано, то выполнение инструкции продолжается и может произойти исключение с более низким приоритетом.

$.3. Реализация и обслуживание виртуальных прерываний

При работе процессора в защищенном режиме возникает ряд проблем при организации обслуживания аппаратных и программных прерываний. Обычно обслуживание прерываний является функцией операционной системы. В защищенном режиме инструкции CLI, STI, изменяющие в регистре EFLAGS значение признака разрешения прерываний IF, выполняются только программами, имеющими уровень привилегий CPLIOPL. При установленном в регистре 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, хранящемся в стеке.