Существует несколько видов экстраординарных ситуаций, в которых поведение процессора регламентируется особыми правилами. Такие ситуации возникают, когда требуется срочная реакция на внешние воздействия, когда при выполнении программы происходит какая-либо ошибка или существует вероятность получения неточного результата вычислений.
В общем случае все эти ситуации разделяются по принципу их обнаружения, источника возникновения и реакции на них на следующие три категории:
- Прерывания и особые ситуации (Interrupts and Exceptions) — обнаруживаются и обрабатываются процессором в самые различные моменты времени и могут происходить как из внешних так и из внутренних источников, все другие типы экстраординарных ситуаций занимают более низкий уровень иерархии и могут обрабатываться, только если сперва заявят о своем существовании через прерывание или особую ситуацию.
- Исключительные ситуации FPU (Floating-Point Exceptions) — могут возникать только при выполнении команд сопроцессора, команд MMX или 3DNow!-команд. Возникновение исключительной ситуации FPU, в свою очередь, может вызывать генерацию прерывания через подачу сигнала на специальные внешние выводы процессора (так называемая реакция в стиле MS-DOS) или особой ситуации (внутренний механизм процессора обеспечивает генерацию ошибки сопроцессора #MF), обработчик которой далее сам разбирается с тем, какое исключение произошло и какие действия в связи с этим следует предпринять (подробнее ...).
- Исключительные ситуации SIMD (SSE) (SIMD Floating-Point Exceptions) — могут возникать только при выполнении SIMD-команд и полностью определяются состоянием SIMD-регистров процессора. SIMD-исключения сообщают о своем возникновении через генерацию специальной особой ситуации #XM. Получив управление, обработчик особой ситуации должен сам программным путем определить причину возникновения исключения (подробнее ...).
Прерывания и особые ситуации
Прерывания и особые ситуации (Interrupts and Exceptions) — это специальные средства, обеспечивающие быструю реакцию процессора на внешние воздействия и прочие неожиданные ситуации. При поступлении прерывания или генерации особой ситуации выполнение программы прерывается, а управление передается специальной процедуре — обработчику прерывания или особой ситуации. В большинстве случаев, когда обработка прерывания или особой ситуации заканчивается, управление может быть возвращено в прерванную программу, которая продолжит свое выполнение с той самой точки, в которой она была остановлена. Процессор производит автоматическое сохранение/восстановление контекста и состояния для обеспечения этой возможности.
Все прерывания и особые ситуации имеют уникальные идентификационные номера. Эти номера называются векторами прерываний и лежат в пределах от 0 до 255. Векторы от 0 до 31 отведены для особых ситуаций и немаскируемого прерывания, причем некоторые из них зарезервированы и не должны использоваться программами. Векторы от 32 до 255 свободны для любого использования пользовательскими программами и внешними устройствами.
Существует два источника поступления прерываний и три типа особых ситуаций. Кроме того, различают внутренние (программные) и внешние (аппаратные) источники генерации прерываний и особых ситуаций.
Внешние или аппаратные прерывания (External or Hardware interrupts):
- Внешние маскируемые прерывания (Maskable Hardware Interrupts) — инициируются сигналами на внешних выводах процессора или с помощью встроенного контроллера прерываний (Advanced Programmable Interrupt Controller – APIC). Для процессоров, начиная с Pentium, встроенный APIC-контроллер является наиболее распространенным способом управления прерываниями. В этом случае выводы LINT[1:0]# программируются через локальную таблицу векторов (LVT) контроллера APIC, которая позволяет назначать соответствующий вывод для приема любого вида прерываний. Если же встроенного контроллера APIC в процессоре нет, или же он отключен, то внешние маскируемые прерывания принимаются на выводе INTR#. При этом номер поступившего прерывания должен передаваться процессору по системной шине специальным внешним контроллером прерываний (например, таким как 8259А). Как правило, встроенный APIC-контроллер также взаимодействует с системным контроллером прерываний (I/O APIC), который обеспечивает прием множества прерываний от разных источников и передает в процессор(ы) информацию о полученном прерывании по системной шине или специальной выделенной шине APIC (APIC serial bus). Если флаг разрешения прерываний не установлен (EFLAGS.IF = 0), то внешние маскируемые прерывания не обрабатываются. Выше указывалось, что для использования маскируемыми прерываниями предназначены векторы от 32 до 255. Технически, однако, возможно определить любому маскируемому прерыванию, которое принимается на выводе INTR# процессора значение вектора в диапазоне от 0 до 255, а если прием прерываний происходит через встроенный APIC-контроллер – в диапазоне от 16 до 255 (при попытке использования векторов от 0 до 15 APIC-контроллер сигнализирует о некорректном векторе прерывания).
- Внешние немаскируемые прерывания (Nonmaskable External Interrupts) — принимаются на выводе NMI# процессора или внутренней шине APIC-контроллера, механизм запрета немаскируемых прерываний отсутствует (на них не влияет текущее значение флага EFLAGS.IF). Получив запрос на немаскируемое прерывание, процессор передает управление по вектору 2 и блокирует прием новых запросов на немаскируемые прерывания вплоть до выполнения команды IRET/IRETD. Технически вектор прерывания 2 может использоваться и для обрабтки маскируемых прерываний, но только описанный выше способ поступления запросов на немаскируемые прерывания обеспечивает особое поведение процессора при их обработке.
Программные прерывания и особые ситуации (Software interrupts and Exceptions):
- Генерируемые процессором особые ситуации (Program-Error Exceptions) — возникают в процессе и по результатам выполнения программного кода, разделяются на ошибки, ловушки и сбои. Каждая особая ситуация генерируется по набору определенных условий и ей соответствует строго определенный вектор прерывания в диапазоне от 0 до 31. Зачастую, при генерации таких особых ситуаций процессор сохраняет в стеке не только адрес возврата из прерывания, но и специальный код ошибки, который позволяет обработчику детально понять причину ошибки, внести коррективы и перезапустить команду, если это возможно. Для обозначения особых ситуаций принято использовать специальные мнемонические обозначения (#DE, #DB и т.д.). Полный перечень всех особых ситуаций, поддерживаемых разными моделями процессоров, приведен в Таблице 3.1.
- Программные прерывания и особые ситуации (Software-Generated Interrupts and Exceptions) — могут быть вызваны командами INTO, INT 3, INT01, INT n, BOUND. При этом только команду INT n правильно относить к командам вызова программных прерываний (Software-Generated Interrupts). Команды INTO, INT 3, BOUND и INT01 по сути являются командами программной генерации особых ситуаций (Software-Generated Exceptions). Например, команда INT 40 генерирует прерывание, передавая управление по вектору номер 40, а команда BOUND edi, [ecx] может сгененрировать особую ситуацию нарушение границ (#BR). В качестве непосредственного операнда команды INT n могут использоваться любые вектора прерываний от 0 до 255. То есть она может использоваться, в том числе, и для программной эмуляции любых особых ситуаций с векторами от 0 до 31. В этом случае, однако, не происходит записи в стек кода ошибки (как это может иметь место в случае генерации особой ситуации аппаратными средствами контроля функционирования процессора). Обработчик особой ситуации, который предполагает, что процессор всегда генерирует и помещает в стек предусмотренный код ошибки, не сможет правильно обработать программный вызов командой INT n, так как выберет из стека некорректное значение адреса возврата для указателя команд EIP. Кроме того, существуют определенные отличия в обработке программных прерываний и программных особых ситуаций в режиме V86.
- Особые ситуации генерируемые средствами самопроверки процессора (Machine-Check Exceptions) — реализованы в процессорах, начиная с Pentium. Условия генерации и типы таких особых ситуаций зависят от модели процессора. Для их обработки используется вектор прерывания 18.
Таблица 3.1. Типы прерываний и особых ситуаций
Название
|
Номер
|
Мне-мо-ника
|
Тип
|
Источник возникновения
|
Генери-руется ли код ошибки?
|
Процессор, в котором впервые появилось
|
Деление на нуль
|
0
|
#DE
|
Ошибка
|
Команды DIV, IDIV и команда AAM с нулевым непосредственным операндом
|
Нет
|
8086
|
Прерывание отладки
|
1
|
#DB
|
Ошибка/Лов.
|
Любые
|
Нет
|
8086
|
Немаскируемое прерывание
|
2
|
NMI
|
Прер.
|
Сигнал на выводе NMI# или внутренней шине APIC-контроллера
|
Нет
|
8086
|
Точка останова
|
3
|
#BP
|
Лов.
|
Команда INT3
|
Нет
|
8086
|
Переполнение
|
4
|
#OF
|
Лов.
|
Команда INTO
|
Нет
|
8086
|
Нарушение границ
|
5
|
#BR
|
Ошибка
|
Команда BOUND
|
Нет
|
80186
|
Неопределенный код операции
|
6
|
#UD
|
Ошибка
|
Команда UD2, зарезервированные коды операций, некорректные команды
|
Нет
|
Intel286
|
Сопроцессор отсутствует
|
7
|
#NM
|
Ошибка
|
Команды FPU, команда WAIT/FWAIT; команды MMX, 3DNow!, SIMD, когда CR0.TS = 1 и CR0.EM = 0
|
Нет
|
Intel286
|
Двойная ошибка
|
8
|
#DF
|
Сбой
|
Любые команды, для которых могут генерироваться особые ситуации, маскируемые и немаскируемые прерывания
|
Да (всегда нуль)
|
Intel286
|
Превышение сегмента сопроцессором – в Intel486 … зарезервировано
|
9
|
|
Сбой
|
Команды FPU, обращающиеся к памяти
|
Нет
|
только Intel286 Intel386
|
Неправильный TSS1
|
10
|
#TS
|
Ошибка
|
Переключение задачи или доступ к сегменту TSS.
|
Да
|
Intel286
|
Сегмент не присутствует1
|
11
|
#NP
|
Ошибка
|
Загрузки сегментных регистров или попытки доступа к системным сегментам (код, данные, стек, LDT, TSS)
|
Да
|
Intel286
|
Ошибка стека
|
12
|
#SS
|
Ошибка
|
Стековые операции и загрузки сегментного регистра SS
|
Да
|
Intel286
|
Общая защита
|
13
|
#GP
|
Ошибка/Лов.
|
Любые ссылки на код или данные и иные операции, предусмотренные механизмом защиты
|
Да
|
Intel286
|
Страничная ошибка1
|
14
|
#PF
|
Ошибка
|
Любые ссылки на код или данные в памяти
|
Да (спец. формат)
|
Intel386
|
Зарезервировано
|
15
|
|
|
|
|
|
Ошибка сопроцессора
|
16
|
#MF
|
Ошибка
|
Команды FPU, команда WAIT/FWAIT,команды MMX, 3DNow!, SIMD при наличии отложенных исключений FPU, когда CR0.TS = 0 и CR0.EM = 0
|
Нет
|
Intel286
|
Контроль выравнивания1
|
17
|
#AC
|
Ошибка
|
Любые невыровненные ссылки на данные в памяти, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3)
|
Да (всегда нуль)
|
Intel486
|
Контроль машины
|
18
|
#MC
|
Сбой
|
Зависит от модели
|
Зависит от модели
|
Penium
|
SIMD-исключение
|
19
|
#XM
|
Ошибка
|
Команды SIMD (SSE)
|
Нет
|
Pentium III
|
Зарезервировано
|
20-31
|
|
|
|
|
|
Прерывания пользователя
|
32-255
|
-
|
Прер.
|
Внешние прерывания или команда INT n
|
Нет
|
8086
|
|
1. Указанные особые ситуации генерируются только в защищенном режиме и режиме V86.
|
|
|
|
|
|
|
|
Типы особых ситуаций и особенности их обработки
Особые ситуации, генерируемые процессором подразделяются на три типа — ошибки, ловушки и сбои. В зависимости от типа особой ситуации различается реакция процессора на ее возникновение.
- Ошибка (Fault) — это особая ситуация, которая может быть исправлена обработчиком особой ситуации. При встрече ошибки состояние процессора сохраняется в том виде, каким оно было до начала выполнения команды, инициировавшей генерацию ошибки, а значения CS:EIP, указывающие на эту команду сохраняются в стеке обработчика. Прерванная программа после исправления ошибки может быть продолжена непосредственно с команды, вызвавшей эту ошибку.
- Ловушка (Trap) — особая ситуация, которая генерируется после выполнения соответствующей команды. В этом случае сохраняемые в стеке значения CS:EIP, указывают на команду, которая будет выполняться вслед за командой, вызвавшей ловушку; например, если ловушка произошла во время команды JMP, то сохраненные значения CS:EIP указывают на команду, являвшуюся целью команды JMP.
- Сбой (Abort) — это особая ситуация, которая не допускает точную локализацию вызвавшей ее команды и не допускает перезапуска. Сбои используются для сообщений о некоторых ошибках, таких как: технические неисправности и наличие некорректных значений в системных таблицах.
Правила функционирования механизма обработки прерываний и особых ситуаций существенно зависят от режима работы процессора и текущих установок некоторых флагов в регистре CR4. Сам этот механизм включает следующие элементы:
Таблица 6.55. Способы обработки процессором прерываний и особых ситуаций в различных режимах работы
Режим работы процессора
|
Тип прер. |
CR0.PE |
VM |
CR4.VME |
CR4.PVI |
IOPL |
IRB |
IDT |
IVT |
Режим реальной адресации
|
П |
0 |
0 |
x |
x |
0 |
x |
– |
+ |
А, О |
0 |
0 |
x |
x |
0 |
x |
– |
+ |
Защищенный режим
|
П |
1 |
0 |
x |
0 |
x |
x |
+ |
– |
А, О |
1 |
0 |
x |
0 |
x |
x |
+ |
– |
Защищенный режим с поддержкой виртуальных флагов прерываний (CR4.PVI = 1)
|
П |
1 |
0 |
x |
1 |
x |
x |
+ |
– |
А, О |
1 |
0 |
x |
1 |
x |
x |
+ |
– |
Режим V86 (CPL = 3, CR4.VME = 0) |
П |
1 |
1 |
0 |
x |
= 3 |
x |
+ |
– |
П
|
1 |
1 |
0 |
x |
< 3 |
x |
#GP(0) |
– |
А, О1 |
1 |
1 |
0 |
x |
x |
x |
+ |
– |
Режим EV86 (CPL = 3, CR4.VME = 1)
|
П |
1 |
1 |
1 |
x |
x |
0 |
– |
+ |
П |
1 |
1 |
1 |
x |
= 3 |
1 |
+ |
– |
П
|
1 |
1 |
1 |
x |
< 3 |
1 |
#GP(0) |
– |
А, О1 |
1 |
1 |
1 |
x |
x |
x |
+ |
– |
x — Флаг или битовое поле может иметь любое значение.
+ — Возможное событие (переход к обработчику прерывания в соответствующем режиме).
1 — Включая особые ситуации, генерируемые командами INTO, INT 3, INT01, BOUND.
|
|