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

Возможности последовательной обработки исключений различных классов

Первое прерывание

Второе прерывание

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