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

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

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

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

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