
- •8. Прерывания и исключения
- •Прерывания и исключения защищенного режима
- •Приоритеты событий, вызывающих прерывания
- •Обработка прерываний в реальном режиме
- •Обработка прерываний в защищенном режиме
- •Возможности последовательной обработки исключений различных классов
- •Условия недостоверности сегмента tss
- •Приоритеты sse-исключений операций с плавающей точкой
- •Виртуальные прерывания в режиме виртуального 8086
- •Варианты обработки прерываний в режиме виртуального 8086
- •Обработка прерываний с использованием idt (защищенный режим)
- •Обработка прерываний с помощью таблицы векторов прерываний (реальный режим).
- •Обработка прерываний с использованием признаков viFиVip
Возможности последовательной обработки исключений различных классов
Первое прерывание |
Второе прерывание | ||
B |
C |
P | |
B |
Последовательная обработка |
Последовательная обработка |
Последовательная обработка |
C |
Последовательная обработка |
Вызов #DF |
Последовательная обработка |
P |
Последовательная обработка |
Вызов #DF |
Вызов #DF |
Исключение 10 - недействительный сегмент TSS (#TS).Это исключение может иметь место при переключении задач. В табл. $.4 указаны условия, при которых сегмент TSS считается недостоверным. При вызове исключения #TSпроцессор включает в стек код ошибки. Если в коде ошибки бит ЕХТ=1, то это означает, что переключение на неверную задачу произошло не программным путем, а от внешнего прерывания через шлюз задачи. Исключение #TSдолжно обрабатываться только через шлюз задачи!
Таблица $.4.
Условия недостоверности сегмента tss
Условие недостоверности |
Код ошибки |
Размер сегмента TSSменьше 67hдля 32-битногоTSS, либо меньше 2Сhдля 16-битногоTSS |
Индекс селектора сегмента TSS |
Ошибка в LDTилиLDTотсутствует |
Индекс селектора сегмента LDT |
Селектор сегмента стека выходит за границу дескрипторной таблицы |
Индекс селектора сегмента стека |
Сегмент стека – не допускает запись | |
DPLсегмента стека не равноCPL | |
RPLселектора сегмента стека не равноCPL | |
Селектор сегмента кода выходит за границу дескрипторной таблицы |
Индекс селектора сегмента кода |
Сегмент кода – не допускает исполнение | |
DPLнеподчиненного сегмента кода не равноCPL | |
DPLподчиненного сегмента кода больше, чемCPL | |
Селектор сегмента данных выходит за границу дескрипторной таблицы |
Индекс селектора данных |
Сегмент данных не допускает чтение |
Исключение 11 - отсутствие сегмента (#NP). Реализуется при обращении к дескриптору, который имеет значение бита присутствияP=0. Такая ситуация возникает в следующих случаях.
Попытка загрузить сегментные регистры CS,DS,ES, GS или FS селекторами дескрипторов, у которыхP=0 (загрузка регистра SS приводит к исключению #SS). Этот случай может иметь место при переключении задач.
Попытка загрузить регистр LDTRс помощью инструкции LLDTселектором дескриптора, у которогоP=0.
Попытка загрузить регистр TRс помощь инструкции LTRселектором дескриптора TSS, у которогоP=0.
Попытка использовать дескриптор шлюза или TSS, у которого P=0, но все остальное абсолютно верно.
Код ошибки содержит индекс селектора, приведшего к возникновению #NP. Если в коде ошибки бит ЕХТ=1, то это означает, что в результате внешнего прерывания произошло обращение к отсутствующему объекту (например, шлюз прерывания ссылается на отсутствующий сегмент). Если в коде ошибки значение битаIDT=1, то это означает, что индекс кода ошибки ссылается на дескрипторную таблицуIDT(например, инструкция INT n выбирает шлюз, у которого бит присутствияP=0).
Исключение 12 - ошибка при обращении к стеку (#SS).Возникает при неправильном обращении к стеку, которое имеет место в следующих ситуациях:
Нарушение границы сегмента стека, на который ссылается регистр SS. Инструкции, которые могут вызвать нарушение границы стека: POP, PUSH, CALL, RET, IRET, ENTER иLEAVE,а также инструкции, у которых один из операндов находится в сегменте стека (например,MOV AX,[BР+6]или MOV AX,SS:[EAX+8])
Попытка загрузить сегментный регистр SS селектором дескриптора, у которого бит присутствия P=0. Это нарушение может возникнуть: при переключении задач, при переходе с одного уровня привилегий на другой с помощью инструкции CALL,при возврате с другого уровня привилегий, при загрузке регистра SS с помощью инструкцийLSS,MOVилиPOP.
Исключение 13 - нарушение общей защиты (#GP).Возникает при всех случаях нарушения защиты, которые не вызывают исключений #NP, #SS, #PFили #TS. К таким случаям относятся:
Нарушение границы сегмента при обращении к сегментам, на которые ссыпаются регистры CS,DS,ES,GSи FS.
Нарушение границы дескрипторной таблицы (кроме случаев переключения задач и переключения стека).
Передача управления невыполняемому сегменту.
Запись в сегмент кода или в сегмент данных, для которого разрешено только чтение.
Чтение из сегмента кода, для которого разрешено только выполнение.
Попытка загрузить сегментный регистр SS селектором сегмента, для которого разрешено только чтение (кроме случая переключения задач}.
Загрузка сегментных регистров SS,DS,ES,FSили GS селекторами системных сегментов.
Загрузка сегментных регистров DS,ES,FSили GS селекторами сегментов кода, допускающих только выполнение.
Загрузка сегментного регистра SS нуль-селектором или селектором сегмента кода.
Загрузка сегментного регистра CS нуль-селектором или селектором сегмента данных.
Обращение к памяти с использованием сегментных регистров DS,ES, FS или GS, когда они содержат нуль-селекторы.
Переключение на занятую задачу.
Переключение на незанятую задачу при выполнении инструкции IRET.
При переключении задач использован селектор, который ссылается на дескриптор TSS в LDT (дескрипторы TSS могут находиться только в GDT).
Нарушение правил защиты сегментов.
Превышение длины инструкции в 15 байт (такая ситуация может возникнуть при использовании излишних префиксов).
Загрузка в регистр управления CR0 содержимого, в котором битPG=1 (страничное преобразование разрешено), а бит РЕ=0 (защищенный режим запрещен).
Загрузка в регистр управления CR0 содержимого, в котором бит NW=1, а битCD=0.
Использование элемента таблицы IDT, который не является шлюзом прерывания, ловушки или задачи.
Попытка в режиме виртуального 8086 передать управление обработчику прерывания через шлюз ловушки или прерывания, если сегмент кода программы-обработчика имеет DPL>0.
Попытка записать 1 в зарезервированный бит регистра CR4.
Попытка выполнить привилегированную инструкцию, когда CPL≠0.
Попытка записи в зарезервированные биты регистра MSR.
Обращение к шлюзу, который содержит нуль-селектор.
Выполнение инструкции INT n,когдаCPL>gDPLвыбираемого шлюза.
Селектор сегмента в шлюзе вызова, прерывания или ловушки, указывает не на сегмент инструкций.
Использование в инструкции LLDTоперанда, который не является селекторомLDTили имеет локальный типTI=1.
Использование в инструкции LTRоперанда, который является локальным селектором или указывает на занятую задачу.
Попытка использовать нуль-селектор для межсегментных переходов.
Обнаружение процессором, в режиме расширенной адресации (CR4.РАЕ=1) и/или большого размера страниц (CR4.РSЕ=1), элемента таблицы указателей каталогов страниц, в зарезервированных полях которого имеются 1 (см. разд. 7.2).
Попытка записи не нулевого значения в зарезервированные биты регистра MXCSR.
Выполнение SSEинструкций, которые обращаются к 128-битной области памяти, не выровненной не 16-байтовую границу, когда инструкции требуется такое выравнивание. Это условие также применяется и к сегменту стека.
Исключение 14 - ошибка обращения к странице (#PF). Имеет место при страничном преобразовании адресов в следующих случаях (см. разд. 7.2):
Бит присутствия P=0 в указателе таблицы или страницы.
Нарушение правил защиты страниц.
Формат кода ошибки для этого исключения (рис. $.3) содержит биты, которые имеют следующее назначение:
31 |
4 |
3 |
2 |
1 |
0 |
Зарезервировано |
RSVD |
U/S |
W/R |
P |
Рис. $.3. Формат кода ошибки для исключения #PF
P=0, если исключение вызвано отсутствием страницы, Р=1, если исключение вызвано нарушением правил защиты для страниц;
W/R=0, если исключение произошло при чтении страницы,W/R=1, если - при записи на страницу.
U/S=0, если исключение произошла при работе процессора в режиме супервизора,U/S=1, если исключение произошло при работе в режиме пользователя:
RSVD=1, если исключение #PFпроизошло из-за того, что процессор обнаружил 1 в зарезервированных битах каталога или таблицы страниц; иначеRSVD=0
Кроме того, в регистр CR2 процессор заносит линейный адрес, приведший к исключению #PF.
Исключение 16 - исключение FPU (#MF).Показывает, чтоFPUобнаружил ошибку при обработке чисел с плавающей точкой (разд. 4.1).
Исключение 17 - ошибка выравнивания (#АС).Возникает при нарушении правил выравнивания операндов, которые процессор проверяет только при уровне привилегийCPL=3 и еслиEFLAGS.АС=1, и если CR0.АМ=1.
Основное правило выравнивания состоит в том, что данные всех типов выравниваются по своей естественной границе соответствующей длине данных (т.е. двойное слово выравнивается на границу двойного слова). Однако есть исключения:
10-байтовое FP-число расширенной точности выравнивается на 8-байтовую границу;
32-битный дальний указатель выравнивается на 2-байтовую границу, а 48-битный дальний указатель – на 4-байтовую границу;
Содержимое 16-битных регистров TRиLDTR, а также 48-битных регистровGDTRиIDTRвыравниваются на 4-байтовую границу;
Битовая строка должна быть выровнена на 2- или 4-байтовую границу в соответствии с типом операнда.
Процессор всегда заносит в стек нулевой код ошибки при вызове исключения #АС.
Исключение 18 - Машинный контроль (#МС).Указывает, что процессор обнаружил внутреннюю машинную ошибку или ошибку на шине, либо внешний агент обнаружил ошибку на шине. Реализация обработки этого исключения является модельно зависимой и обеспечивается с помощью модельно-специфических регистров MSR.
Исключение 19 - Исключение SSE (#ХМ).Показывает, что процессор обнаружил ошибку при выполненииSSE-инструкций. Типы ошибок здесь такие же, как и при работе блокаFPU, но при выполненииSSE-инструкции обрабатывается одновременно несколько операндов, поэтому возможно одновременное возникновение нескольких условийSSE-ошибок. В этом случае будет сообщено только об ошибке с наивысшим приоритетом, а остальные будут проигнорированы. В табл. $.5 даны приоритетыSSE-исключений операций с плавающей точкой.
Таблица $.5