Система прерываний

Для обработки событий, происходящих асинхронно по отношению к выполнению программы, лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции. Например, хорошо спроектированные системы повышенной надежности используют прерывание по аварии в питающей сети для выполнения процедур записи содержимого регистров и оперативной памяти на магнитный носитель, с тем чтобы после восстановления питания можно было бы продолжить работу с того же места.

Существует несколько видов экстраординарных ситуаций, в которых поведение процессора регламентируется особыми правилами. Такие ситуации возникают, когда требуется срочная реакция на внешние воздействия, когда при выполнении программы происходит какая-либо ошибка или существует вероятность получения неточного результата вычислений.

В общем случае все эти ситуации разделяются по принципу их обнаружения, источнику возникновения и реакции на них на следующие три категории.

  • 1. Прерывания и особые ситуации (Interrupts and Exceptions) — обнаруживаются и обрабатываются процессором в самые различные моменты времени и могут происходить как из внешних, так и из внутренних источников; все другие типы экстраординарных ситуаций занимают более низкий уровень иерархии и могут обрабатываться, только если сперва заявят о своем существовании через прерывание или особую ситуацию.
  • 2. Исключительные ситуации FPU (Floating-Point Exceptions) — могут возникать только при выполнении команд сопроцессора, команд ММХ или 3DNowl-команд. Возникновение исключительной ситуации FPU, в свою очередь, может вызывать генерацию прерывания через подачу сигнала на специальные внешние выводы процессора (так называемая реакция в стиле MS-DOS) или особой ситуации (внутренний механизм процессора обеспечивает генерацию ошибки сопроцессора #MF), обработчик которой далее сам разбирается с тем, какое исключение произошло и какие действия в связи с этим следует предпринять.
  • 3. Исключительные ситуации SIMD (SSE) (SIMD Floating-Point Exceptions) — могут возникать только при выполнении SIMD-команд и полностью определяются состоянием 5/Л//)-регистров процессора. ,5УЛ//)-исключения сообщают о своем возникновении через генерацию специальной особой ситуации #ХМ. Получив управление, обработчик особой ситуации должен сам программным путем определить причину возникновения исключения.

Прерывания и особые ситуации

Прерывания и особые ситуации (Interrupts and Exceptions) — это специальные средства, обеспечивающие быструю реакцию процессора на внешние воздействия и прочие неожиданные ситуации. При поступлении прерывания или генерации особой ситуации выполнение программы прерывается, а управление передается специальной процедуре — обработчику прерывания или особой ситуации. В большинстве случаев, когда обработка прерывания или особой ситуации заканчивается, управление может быть возвращено в прерванную программу, которая продолжит свое выполнение с той самой точки, в которой она была остановлена. Процессор производит автоматическое сохранение/восстановление контекста и состояния для обеспечения этой возможности.

Все прерывания и особые ситуации имеют уникальные идентификационные номера. Эти номера называются векторами прерываний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользовательскими программами и внешними устройствами.

Существует два источника поступления прерываний и три типа особых ситуаций. Кроме того, различают внутренние (программные) и внешние (аппаратные) источники генерации прерываний и особых ситуаций.

Внешние или аппаратные прерывания (External or Hardware interrupts):

1) внешние маскируемые прерывания (Maskable Hardware Interrupts) — инициируются сигналами на внешних выводах процессора или с помощью встроенного контроллера прерываний (Advanced Programmable Interrupt Controller — APIC). Для процессоров, начиная с Pentium, встроенный ДР/С-контроллер является наиболее распространенным способом управления прерываниями. В этом случае выводы LINT[ 1:0]# программируются через локальную таблицу векторов (LVT) контроллера APIC, которая позволяет назначать соответствующий вывод для приема любого вида прерываний. Если же встроенного контроллера APIC в процессоре нет или же он отключен, то внешние маскируемые прерывания принимаются на выводе

INTR#. При этом номер поступившего прерывания должен передаваться процессору по системной шине специальным внешним контроллером прерываний (например, таким как 8259Л). Как правило, встроенный Л/’/С-контроллер также взаимодействует с системным контроллером прерываний {I/O APIC), который обеспечивает прием множества прерываний от разных источников и передает в процессор(ы) информацию о полученном прерывании по системной шине или специальной выделенной шинzAPIC (APIC serial bus). Если флаг разрешения прерываний не установлен (EFLAGS.IF= 0), то внешние маскируемые прерывания не обрабатываются. Выше указывалось, что для использования маскируемыми прерываниями предназначены векторы от 32 до 255. Технически, однако, возможно определить любому маскируемому прерыванию, которое принимается на выводе INTR# процессора, значение вектора в диапазоне от 0 до 255, а если прием прерываний происходит через встроенный Л.Р/С-контроллер — в диапазоне от 16 до 255 (при попытке использования векторов от 0 до 15 APIC-контроллер сигнализирует о некорректном векторе прерывания);

2) внешние немаскируемые прерывания (Nonmaskable External Interrupts) — принимаются на выводе NMI# процессора или внутренней шинеЛ.Р/С-контроллера, механизм запрета немаскируемых прерываний отсутствует (на них не влияет текущее значение флага EFLAGS.IF). Получив запрос на немаскируемое прерывание, процессор передает управление по вектору 2 и блокирует прием новых запросов на немаскируемые прерывания вплоть до выполнения команды IRET/IRETD. Технически вектор прерывания 2 может использоваться и для обрабтки маскируемых прерываний, но только описанный выше способ поступления запросов на немаскируемые прерывания обеспечивает особое поведение процессора при их обработке.

Программные прерывания и особые ситуации (Software interrupts and Exceptions):

  • 1) генерируемые процессором особые ситуации (Program-Error Exceptions) — возникают в процессе и по результатам выполнения программного кода, разделяются на ошибки, ловушки и сбои. Каждая особая ситуация генерируется по набору определенных условий, и ей соответствует строго определенный вектор прерывания в диапазоне от 0 до 31. Зачастую при генерации таких особых ситуаций процессор сохраняет в стеке не только адрес возврата из прерывания, но и специальный код ошибки, который позволяет обработчику детально понять причину ошибки, внести коррективы и перезапустить команду, если это возможно. Для обозначения особых ситуаций принято использовать специальные мнемонические обозначения (#DE, #DB и т.д.). Полный перечень всех особых ситуаций, поддерживаемых разными моделями процессоров, приведен в табл. 6.1;
  • 2) программные прерывания и особые ситуации (Software-Generated Interrupts and Exceptions) — могут быть вызваны командами INTO, INT3, INTOl, INTп, BOUND. При этом только команду INTп правильно относить к командам вызова программных прерываний (Software-Generated Interrupts). Команды INTO, INT3, BOUND и INTOi по сути являются командами программной генерации особых ситуаций (Software-Generated Exceptions). Например, команда INT40 генерирует прерывание, передавая управление по вектору номер 40, а команда BOUND edi, fecx] может сгененрировать особую ситуацию нарушение границ (#BR). В качестве непосредственного операнда команды INT п могут использоваться любые векторы прерываний от 0 до 255. То есть она может использоваться в том числе и для программной эмуляции любых особых ситуаций с векторами от 0 до 31. В этом случае, однако, не происходит записи в стек кода ошибки (как это может иметь место в случае генерации особой ситуации аппаратными средствами контроля функционирования процессора). Обработчик особой ситуации, который предполагает, что процессор всегда генерирует и помещает в стек предусмотренный код ошибки, не сможет правильно обработать программный вызов командой INTп, так как выберет из стека некорректное значение адреса возврата для указателя команд EIP. Кроме того, существуют определенные отличия в обработке программных прерываний и программных особых ситуаций в режиме К86;
  • 3) особые ситуации, генерируемые средствами самопроверки процессора (Machine-Check Exceptions) — реализованы в процессорах, начиная с Pentium. Условия генерации и типы таких особых ситуаций зависят от модели процессора. Для их обработки используется вектор прерывания 18.

Типы особых ситуаций и особенности их обработки

Особые ситуации, генерируемые процессором, подразделяются на три типа — ошибки, ловушки и сбои. В зависимости от типа особой ситуации различается реакция процессора на ее возникновение.

Ошибка (Fault) — это особая ситуация, которая может быть исправлена обработчиком особой ситуации. При встрече ошибки состояние процессора сохраняется в том виде, каким оно было до начала выполнения команды, инициировавшей генерацию ошибки,

262

Типы прерываний и особых ситуаций

Название

Номер

Мнемо

ника

Тип

Источник возникновения

Генерируется ли код

ошибки?

Процессор, в котором

впервые появилось

1

2

3

4

5

6

7

Деление на нуль

0

#/)?

Ошибка

Команды DIV, IDIVи команда ЛАМ с нулевым непосредственным операндом

Нет

8086

Прерывание отладки

1

#DB

Ошибка/

Ловушка

Любые

Нет

8086

Немаскируемое

прерывание

2

NMI

Прерывание

Сигнал на выводе NMI# или внутренней шине /4Т7С-контроллера

Нет

8086

Точка останова

3

#ВР

Ловушка

Команда INT3

Нет

8086

Переполнение

4

#OF

Ловушка

Команда INTO

Нет

8086

Нарушение границ

5

#BR

Ошибка

Команда BOUND

Нет

80186

Неопределенный код операции

6

#UD

Ошибка

Команда UD2, зарезервированные коды операций, некорректные команды

Нет

Intel286

Сопроцессор отсутствует

7

#NM

Ошибка

Команды FPU, команда WAIT/ FWAIT; команды ММХ, 3DNow,

SI MD, когда С RO. TS = 1 и CRO.EM = 0

Нет

Intel286

1

2

3

4

5

6

7

Двойная ошибка

8

#DF

Сбой

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

Да (всегда нуль)

Intel286

Превышение сегмента сопроцессором — в 1гЦе1486... зарезервировано

9

Сбой

Команды FPU, обращающиеся к памяти

Нет

только

lntel286

lntel386

Неправильный

Ш1

10

#TS

Ошибка

Переключение задачи или доступ к сегменту TSS

Да

Intel286

Сегмент не присутствует*

11

#NP

Ошибка

Загрузки сегментных регистров или попытки доступа к системным сегментам (код, данные, стек, LDT,

TSS)

Да

lntel286

Ошибка стека

12

#SS

Ошибка

Стековые операции и загрузки сегментного регистра SS

Да

lntel286

Общая защита

13

#GP

Ошибка/

Ловушка

Любые ссылки на код или данные и иные операции, предусмотренные

механизмом защиты

Да

Intel286

Страничная

ошибка*

14

#PF

Ошибка

Любые ссылки на код или данные

в памяти

Да (спец, формат)

Intel386

Зарезервировано

15

1

2

3

4

5

6

7

Ошибка сопроцессора

16

#MF

Ошибка

Команды FPU, команда WAIT/

FWAIT, команды ММХ, 3DNow,

SIMD при наличии отложенных исключений FPU, когда CRO. TS = 0 и CR0.EM=0

Нет

Intel286

Контроль выравнивания*

17

#АС

Ошибка

Любые невыравненные ссылки на данные в памяти, если активирован контроль выравнивания (CR0.AM = 1, ЕFLAGS.АС = 1,

CPL = 3)

Да (всегда нуль)

Intel486

Контроль машины

18

#МС

Сбой

Зависит от модели

Зависит

от модели

Penium

5УЛ//)-исключение

19

#ХМ

Ошибка

Команды SIMD (SSE)

Нет

Pentium III

Зарезервировано

20-31

Прерывания пользователя

32-255

Прерывание

Внешние прерывания или команда INT п

Нет

8086

* Указанные особые ситуации генерируются только в защищенном режиме и режиме И86.

а значения CS: EIP, указывающие на эту команду, сохраняются в стеке обработчика. Прерванная программа после исправления ошибки может быть продолжена непосредственно с команды, вызвавшей эту ошибку.

Ловушка (Trap) — особая ситуация, которая генерируется после выполнения соответствующей команды. В этом случае сохраняемые в стеке значения CS: EIP указывают на команду, которая будет выполняться вслед за командой, вызвавшей ловушку; например, если ловушка произошла во время команды JMP, то сохраненные значения CS: EIP указывают на команду, являвшуюся целью команды JMP.

Сбой (Abort) — это особая ситуация, которая не допускает точную локализацию вызвавшей ее команды и не допускает перезапуска. Сбои используются для сообщений о некоторых ошибках, таких как технические неисправности и наличие некорректных значений в системных таблицах.

Правила функционирования механизма обработки прерываний и особых ситуаций существенно зависят от режима работы процессора и текущих установок некоторых флагов в регистре CR4 (табл. 6.2). Сам этот механизм включает следующие элементы:

  • • таблица дескрипторов прерываний IDT (в режиме реальной адресации — таблица векторов прерываний IVT);
  • • регистр таблицы дескрипторов прерываний IDTR;
  • • флаг маскирования внешних прерываний EFLAGS.IF
  • • флаги для работы с виртуальными прерываниями EFLAGS. VIE, Е FLAGS. VIР
  • • специальная таблица — карта перенаправления прерываний IRB — располагается в сегменте TSS задачи;
  • • специальные типы дескрипторов шлюзов.

Прерывания и особые ситуации: реальный режим

В режиме реальной адресации поддерживается гораздо меньше прерываний и особых ситуаций, чем в защищенном режиме. Их обработка в современных процессорах производится совершенно аналогично тому, как это делалось в процессоре 8086.

Специальная таблица (рис. 6.2), называемая таблицей векторов прерываний (Interrupt Vector Table — IVT) или просто таблицей прерываний, размещается в памяти по нулевому адресу (по умолчанию). Каждому вектору прерывания или особой ситуации в этой таблице соответствует 32-битное поле, которое содержит дальний указатель на процедуру-обработчик. Процессор автоматически выбирает из па-

Таблица 6.2

Способы обработки процессором прерываний и особых ситуаций в различных режимах работы

Режим работы процессора

Тип прер.

CR0.PE

УМ

CR4. УМЕ

CRA.Pyi

IOPL

IRB

IDT

ІУТ

Режим реальной адресации

П

0

0

X

X

0

X

+

А, О

0

0

X

X

0

X

+

Защищенный режим

П

1

0

X

0

X

X

+

А, О

1

0

X

0

X

X

+

Защищенный режим с под-держкой виртуальных флагов прерываний (СЯ4.РУ1= 1)

П

1

0

X

1

X

X

+

А, О

1

0

X

1

X

X

+

Режим У86

(СРЬ = 3, СЖ УМЕ = 0)

П

1

1

0

X

= 3

X

+

П

1

1

0

X

<3

X

#GP( 0)

А, О1

1

1

0

X

X

X

+

Режим ЕУ86

(СРЬ = 3, СЖ УМЕ= 1)

П

1

1

і

X

X

0

+

П

1

1

і

X

= 3

1

+

П

1

1

і

X

<3

1

#GP( 0)

А, О1

1

1

і

X

X

X

+

х — Флаг или битовое поле может иметь любое значение.

+ — Возможное событие (переход к обработчику прерывания в соответствующем режиме). 1 — Включая особые ситуации, генерируемые командами INTO, INT3, INTOX, BOUND.

Вектор прерывания О

Вектор

прерывания 3

Вектор

прерывания 2

Вектор прерывания 1

Селектор

Смещение

  • 8
  • 2
  • 15
  • 0

/077?

Рис. 6.2. Таблица векторов прерываний в реальном режиме работы

мяти соответствующий указатель при поступлении прерывания или генерации особой ситуации, затем сохраняет в стеке текущие значения FLAGS, CS, IP, очищает биты IF, TF, АС регистра FLAGS и передает управление по считанному адресу (рис. 6.3).

Старый SP

Новый SP

Рис. 6.3. Стек после вызова прерывания или особой ситуации

в реальном режиме работы

Начальный адрес таблицы векторов прерываний по умолчанию устанавливается нулевым. Но в процессорах, начиная с Intel286, он может быть переопределен путем программирования регистра IDTR с помощью команды LIDT. На практике для сохранения совместимости с программным обеспечением процессоров 8086/8088 такое переопределение обычно не использовалось.

Если при обработке поступившего запроса на прерывание при записи значений в стек процессор превышает предел стекового сегмента, то согласно документации Intel должно генерироваться прерывание 12. Однако на практике некоторые модели процессоров в такой ситуации могут вести себя иначе. Когда при поступлении

запроса на прерывание значение в регистре стека (E)SP равно 1, 3 или 5, возможна полная остановка процессора (переход в режим останова, аналогично тому, как это происходит по команде HLT).

Работа механизма реакции на прерывания и особые ситуации в защищенном режиме базируется на специальной таблице дескрипторов прерываний (Protected-Mode Interrupt Descriptor Table — IDT). Базовый адрес (BASE) этой таблицы и ее предел (LIMIT) заносятся в регистр IDTR с помощью команды LIDT(рис. 6.4).

Таблица IDTсодержит до 256 специальных дескрипторов, каждый из которых соответствует своему прерыванию. Эти дескрипторы занимают по 8 байт каждый и располагаются в таблице последовательно без каких-либо промежутков. Самый первый дескриптор, расположенный по самому младшему адресу в начале таблицы, соответствует прерыванию 0, а самый последний дескриптор, расположенный по самому старшему адресу в таблице, соответствует прерыванию 255.

Дескриптор шлюза N

•*

BASE + N*8

У"-

к

1

Дескриптор шлюза 3

BASE + 24

Дескриптор шлюза 2

BASE+16

Дескриптор шлюза 1

BASE + 8

Дескриптор шлюза 0

P Л СГ -л і

UMjL ^ 1

31

0

IDTR

Базовый адрес ЮТ (BASE)

Предел ЮТ

Рис. 6.4. Таблица дескрипторов прерываний (ЮТ) в защищенном режиме работы

В качестве дескрипторов таблицы IDT могут использоваться дескрипторы разного типа — шлюза прерывания, шлюза ловушки и шлюза задачи. Поведение процессора при поступлении запроса на прерывание зависит как от типа применяемого для данного прерывания дескриптора, так и от текущего уровня привилегий задачи.

В случае если в качестве дескриптора прерывания используется шлюз задачи, процессор при поступлении запроса на прерывание выполняет все действия по переключению на новую задачу, сохраняя текущее состояние в TSS старой задачи и загружая новые значения в регистры из TSS задачи обработчика прерывания. Применение такого шлюза оправдано для обработки ошибок и сбоев, которые не могут быть обработаны в рамках текущей задачи (например, ошибки, возникающие при переключении задач).

Если в качестве дескриптора прерывания используется шлюз ловушки или шлюз прерывания, то переключения задач не происходит и программа-обработчик функционирует в рамках той же задачи, что и прерванный код. Отличие шлюза прерывания состот лишь в том, что процессор автоматически сбрасывает флаг EFLAGS.IFпри передаче управления в обработчик, чем обеспечивается маскирование внешних прерываний. Впоследствии при возврате из процедуры обработчика прежнее значение регистра EFLAGS восстанавливается из стека.

Особенности работы процессора при передаче управления обработчику прерываний защищенного режима

Механизм защиты для прерываний в защищенном режиме функционирует практически таким же образом, как это происходит при выполнении команды вызова подпрограммы CALL. Некоторые особенности его работы заключаются в следующем:

  • • процессор не проверяет текущий уровень привилегий CPL для внешних прерываний;
  • • поскольку для прерываний не существует отдельного селектора, то все правила для запрашиваемого уровня привилегий селектора (RPL) игнорируются;
  • • процессор проверяет уровень привилегий DPL шлюза только для программных прерываний, генерируемых командами INT п, INT3, INTO, с тем чтобы предотвратить генерацию таких прерываний, если CPL > DPL.

Если обработчик прерывания защищенного режима (Protected-mode Exception and Interrupt Handler) будет расположен в согласованном кодовом сегменте, то ему при получении управления будет доступен только сегмент стека и те сегменты, привилегии которых позволяют это. Если же обработчик будет размещен в несогласованном кодовом сегменте с нулевым уровнем привилегий, то независимо от CPL прерванной программы ему будут доступны все сегменты.

При поступлении запроса на прерывание процессор сохраняет текущие значения ЕЕЬАСЗ, С51 и Е1Р в стеке. Если для обрабатываемого прерывания предусмотрена генерация кода ошибки, то этот код сохраняется в стеке сразу после значения Е1Р.

Когда передача управления в обработчик связана с изменением уровня привилегий на более высокий (меньшее числовое значение), это сопровождается переключением стека. Новые значения для ^5 и ЕЗР берутся из 7^5 задачи в соответствии с уровнем привилегий обработчика. Переключение стека производится до сохранения указанных выше регистров, причем в новом стеке в первую очередь сохраняются значения ?5 и ЕЗР, указывающие на старый стек (рис. 6.5).

Уровень привилегий не изменяется, нет кода ошибки

Уровень привилегий не изменяется, есть код ошибки

— Старый ESP

Старый EFLAGS

Старый EFLAGS

Старый CS

| Старый CS

Старый EIP

Старый EIP

-ч— Новый ESP

Код ошибки

Старый ESP

Новый ESP

Уровень привилегий Уровень привилегий

изменяется, изменяется,

нет кода ошибки есть код ошибки

-<— ESP из TSS

| Старый 5S

| Старый 55

Старый ESP

Старый Е5Р

Старый EFLAGS

Старый EFLAGS

| Старый CS

| Старый С5

Старый EIP

Старый Е1Р

-ч— Новый ESP

Код ошибки

ESP из TSS

Новый ESP

Рис. 6.5. Стек после вызова прерывания или особой ситуации

в защищенном режиме

При передаче управления в обработчик через шлюз прерывания или шлюз ловушки процессор сбрасывает флаги ЕЕЬАСЗ.ТЕ, ЕЕЬАСЗ. ЯЬ и ЕЕЬАСЗ.N1, чтобы отключить трассировку прерываний и некоторые особенности обработки вложенных задач. Кроме того, при использовании шлюза прерывания сбрасывается также и флаг разрешения прерываний ЕЕЬАСЗАЬ.

Стек процессора 1п1е1286 после вызова прерывания или особой ситуации заполняется аналогично, за исключением того, что сохраняемые значения — 16-битные.

Процессоры Intel386 и Intel486 сохраняют код ошибки в стеке как 16-битное значение, а процессоры, начиная с Pentium, сохраняют его как 32-битное значение с нулевыми старшими битами.

Режим с поддержкой виртуальных флагов прерываний

В процессорах, начиная с Pentium, возможен специальный подвид защищенного режима с поддержкой виртуальных флагов прерываний (Protected-mode Virtual Interrupts), который включается установкой флага CR4.PVI. В этом режиме процессор обеспечивает автоматическую поддержку отслеживания запросов от внешних маскируемых источников прерываний для задач, выполняемых на уровне привилегий CPL = 3 при EFLAGS.IOPL < 3. Для обеспечения такой поддержки применяются специальные флаги VIF и VIР в регистре EFLAGS. Этот механизм во многом похож на режим EV86, который, в свою очередь, предназначен для работаты с виртуальными прерываниями в режиме ^б.

В обычном защищенном режиме (CR4.PVI = 0), когда EFLAGS. IOPL < CPL, все попытки изменения флага EFLAGS.IF командами STI, CLI вызывают генерацию ошибки общей защиты (#GP). Когда же виртуальные прерывания инициализированы (CR4.PVI = = 1), команды CLI и STI оказывают влияние на флаг EFLAGS. VIF, а флаг EFLAGS. IF при этом остается неизменным. При поступлении внешнего маскируемого прерывания процессор производит стандартное обращение к обработчику прерываний защищенного режима (процедура этого обращения описана выше). Обработчик прерывания должен произвести анализ флага EFLAGS. VIF и в зависимости от его значения произвести следующие действия:

  • • если в момент поступления запроса на прерывание EFLAGS. VIF= = 1, значит, прерывания были разрешены в программе уровня привилегий 3 — обработчик защищенного режима может либо сам обработать это прерывание, либо передать управление в соответствующий обработчик в прерванной задаче, эмулируя поступление соответствующего внешнего прерывания;
  • • если в момент поступления запроса на прерывание EFLAGS. VIF= = 0, значит, прерывания были запрещены в программе уровня привилегий 3, обработчик защищенного режима может сам обработать поступившее прерывание, но если это необходимо делать внутри программы уровня привилегий 3, обработчик защищенного режима устанавливает специальный флаг отложенного прерывания EFLAGS. VIP и возвращает управление в прерванную программу.

Если при выполнении программы уровня привилегий 3 процессор разрешает прием внешних маскируемых прерываний, устанавливая флаг EFLAGS. VIF (например, командой 577), а флаг EFLAGS. VIР = — 1, то перед установкой флага EFLAGS. VIF срабатывает вызов отложенного прерывания и генерируется ошибка общей защиты (#GP). Обработчик ошибки общей защиты должен распознавать такие ситуации и соответствующим образом обрабатывать поступившие запросы на прерывание. Рекомендуемая последовательность его действий перед возвратом управления в прерванную программу: очистка флага EFLAGS. VIР и установка флага EFLAGS. VIF в сохраненном в стеке образе регистра EFLAGS; возврат управления в прерванную программу.

В некоторых редких случаях флаги EFLAGS. VIP и EFLAGS. VIF могут оказаться установленными одновременно (например, командой IRETD или на уровне привилегий, отличном от 3). Тогда перед выполнением очередной команды программы уровня привилегий 3 генерируется ошибка общей защиты (#GP).

Таким образом, флаг EFLAGS. VIP никогда автоматически не изменяется процессором, а должен устанавливаться и сбрасываться программным обеспечением самостоятельно.

Текущие значения флагов EFLAGS. VIF и EFLAGS. VIP никак не влияют на работу процессора на уровне привилегий, отличном от 3.

Команды POPF/POPFD и PUSHF/PUSHFD выполняются при активированном механизме виртуальных прерываний защищенного режима (CR4.PVI = 1) точно так же, как и без него (CR4.PVI = 0).

Обработка прерываний в режиме V86 очень похожа на то, как это происходит в защищенном режиме. Однако существуют некоторые особенности, вызванные прежде всего спецификой режима F86 и стремлением достичь максимальной совместимости с программами процессора 8086. Специальный механизм виртуальных прерываний, управляемый битом CR4. VME и реализуемый в процессорах, начиная с Pentium, дополняет возможные способы обработки прерываний в режиме F86.

 
< Пред   СОДЕРЖАНИЕ     След >