Конспект лекций по курсу «Организация ЭВМ и систем» Организация прерываний

Вид материалаКонспект
1- EM – EMulation – эмуляция
3) Загрузка регистра TR селектором и его теневого регистра дескриптором TSS входящей задачи.4)
6) Переход к выполнению входящей задачи (начальный адрес программы предварительно загружен из TSS в регистровую пару CS:EIP. Тип
Тип 12 (#SS). Ошибка при обращению к стеку.
Тип 13 (#GP). Нарушение общей защиты.
Тип 16 (#MF). Прерывание FPU.
Подобный материал:
1   2   3   4

Тип 3 (#BP). Генератором этого особого случая является однобайтная команда INT, которой по умолчанию присваивается тип прерывания 3. Эту команду обычно вставляют в текст отлаживаемой программы для ее останова в заданной точке и анализа текущих результатов выполнения. Особый случай – ловушка.


Тип 5 (#BR). Источником этого особого случая является команда BOUND, с помощью которой осуществляется проверка возможного выхода текущего значения индекса за пределы массива. Эта команда использует три операнда: текущий индекс, верхняя граница и нижняя граница. При несоблюдении индексом границ массива осуществляется выход на особый случай этого типа, трактуемый как нарушение.


Тип 6 (#UD). Этот особый случай имеет место на этапе декодирования машинной команды при обнаружении недопустимого или зарезервированного кода операции. Кроме того, он может иметь место при некорректном задании адреса, например, в том случае, если в команде JMP FAR с косвенной адресацией перехода в постбайте адресации задается регистр, а не память.

Еще одним примером может служить некорректное использование префикса LOCK (захват шины) перед командой, для которой его использование является некорректным.


Тип 7 (#NM). В управляющем регистре CR0 содержится два бита, оказывающих влияние на выполнение команд FPU:

1- EM – EMulation – эмуляция;

2 – TS – Task Switched – задача переключена.


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


Бит TS устанавливается при переключении задачи. Стандартное переключение задач предполагает переключение контекста только для CPU, но не для FPU. Таком образом, проверка бита TS перед выполнением команды FPU позволяет реализовать на программном уровне переключение контекста FPU со старой задачи на новую.


Перед выполнением любой команды FPU CPU проверяет биты EM и TS, и если хотя бы один из них установлен, генерируется нарушение #NM.

CPU распознает команды FPU по специальному коду ESC в старшем байте команды (ОРС). Для команд FPU старшие 5 бит кода операции имеют значение (11011 = код ESC).

Реакцией CPU при выделении команды FPU при установленном флаге TS является сохранение контекста FPU (содержимого его основных регистров) в дополнительной части сегмента TSS выходящей задачи и выборка нового содержимого этих регистров из дополнительной части сегмента TSS входящей задачи.


Тип 8 (#DF). Обычно, когда CPU обнаруживает особый случай при попытке вызвать обработчик предыдущего особого случая, два особых случая обрабатываются последовательно. Если же CPU не может обработать их последовательно, генерируется особый случай двойной ошибки, классифицируемый как авария. Для выделения ситуаций, приводящих к двойной ошибке, особые случаи разделяются на три класса:

• А – легкие;

• В – тяжелые;

• С – страничное нарушение.

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


Первый особый случай

Второй особый случай

А

В

С

А

последовательно

последовательно

последовательно

В

последовательно

#DF

последовательно

С

последовательно

#DF

#DF

Процессор всегда включает код ошибки в стек обработчика. Однако этот код содержит полный ноль.

Двойное нарушение классифицируется как авария в связи с тем, что, как правило, оказывается невозможным осуществить рестарт виновной команды. Если при попытке вызвать двойное нарушение возникает любое другое нарушение, CPU переходит в режим отключения (shutdown). Этот режим аналогичен состоянию CPU после выполнения команды останова HLT (эта команда является привилегированной CPL=0).

Из этого состояния CPU выводится только аппаратно: сигналом NMI, который оставляет процессор в R-режиме, либо сигналом RESET, который переводит процессор в R-режим.


Тип 10 (#TS). Этот особый случай может иметь место только при переключении задач. Переключение задач может инициироваться следующими событиями:


1. Текущая задача выполняет команды JMP FAR или CALL FAR со ссылкой на дескриптор TSS (прямое переключение задач). Адрес перехода или вызова содержит селектор, индексирующий дескриптор TSS обязательно в GDT.


2. текущая задача выполняет команды JMP FAR или CALL FAR со ссылкой на шлюз задачи (косвенное переключение задач). Адрес перехода или вызова содержит селектор, индексирующий дескриптор шлюза задачи в GDT или LDT. В свою очередь, селектор шлюза задачи индексирует дескриптор TSS.


3. обработчик прерывания или особого случая векторизируется через шлюз задачи, расположенный в IDT.


4. текущая задача выполняет команду IRET для возврата в предыдущую задачу при установленном флаге NT (Nested Task –). Флаг NT является актуальным только для Р-режима и устанавливается, если переключение задач вызвано командой CALL FAR или выходом на прерывание / особый случай. С помощью флага NT реализуется цепь вложенных задач (по аналогии с вложенными подпрограммами).


Основными действиями при переключении задач являются:


1) Сохранение контекста выходящей задачи. Для этого CPU выбирает базовый адрес сегмента TSS из теневого регистра, расширяющего системный регистр TR, и копирует в этот сегмент основные регистры процессора (РОНы, сегментные регистры, флаги EFLAGS, EIP). , образующие динамические поля обязательной части TSS. Статические поля TSS, которые не изменяются при выполнении задачи, не копируются. К основным статическим полям относятся:

1. селектор LDT;

2. содержимое управляющего регистра CR#;

3. полные указатели стеков SSk, ESPk для трех высших уровней привилегий.


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


3) Загрузка регистра TR селектором и его теневого регистра дескриптором TSS входящей задачи.


4) Установка бита TS в регистре CR0.


5) Загрузка контекста входящей задачи из ее сегмента TSS в регистры процессора.


6) Переход к выполнению входящей задачи (начальный адрес программы предварительно загружен из TSS в регистровую пару CS:EIP.


Тип 11 (#NP). Реализуется при обращении к дескриптору, который имеет значение бита присутствия Р = 0. Такая ситуация возникает в следующих случаях:
  1. Попытка загрузить сегментные регистры CS, DS, ES, GS или FS селекторами дескрипторов, у которых бит Р = 0 (загрузка регистра SS приводит к прерыванию #SS). Этот случай может иметь место при переключении задач.
  2. Попытка загрузить регистр LDTR с помощью команды LLDT селектором дескриптора, у которого бит Р = 0.
  3. Попытка загрузить регистр TR с помощью команды LTR селектором дескриптора TSS, у которого бит Р = 0.
  4. Попытка использовать дескриптор шлюза или дескриптор TSS, для которых бит присутствия Р = 0.


Код ошибки содержит индекс селектора, приведшего к возникновению #NP. Если в коде ошибки установлен бит EXT = 1, то это означает, что в результате внешнего прерывания произошло обращение к отсутствующему объекту. Если в коде ошибки значение бита IDT = 1, то это означает, что индекс кода ошибки ссылается на дескрипторную таблицу IDT (например, команда INT n выбирает шлюз, у которого бит присутствия Р = 0).


Тип 12 (#SS). Ошибка при обращению к стеку. Возникает при неправильном обращении к стеку, которое имеет место в следующих ситуациях:

  1. Нарушение границы сегмента стека, на который ссылается регистр SS. Команды, которые могут вызвать нарушение границы стека: POP, PUSH, CALL, RET, IRET, ENTER и LEAVE, а также команды, у которых один из операндов находится в сегменте стека (например, MOV CX, [BP+8] или MOV EDX, SS:[EAX+6]).
  2. Попытка загрузить сегментный регистр SS селектором дескриптора, у которого бит присутствия Р = 0. Это нарушение может возникнуть: при переключении задач, при переходе с одного уровня привилегий на другой с помощью команды CALL, при возврате с другого уровня привилегий, при выполнении команды LSS, при загрузке регистра SS с помощью команд MOV или POP.


Тип 13 (#GP). Нарушение общей защиты. Возникает при всех случаях нарушения защиты, которые не вызывают прерываний #NP, #SS, #PF или #TS. К таким случаям относятся:

  1. Нарушение границы сегмента при обращении к сегментам, на которые ссылаются регистры CS, DS, ES, GS и FS.
  2. Нарушение границы дескрипторной таблицы (кроме случаев переключения задач и переключения стека).
  3. Передача управления невыполняемому сегменту.
  4. Запись в сегмент кода или в сегмент данных, для которого разрешено только чтение.
  5. Чтение из сегмента кода, для которого разрешено только выполнение.
  6. Попытка загрузить сегментный регистр SS селектором сегмента для которого разрешено только чтение
  7. Загрузка сегментных регистров неподходящими селекторами.
  8. Переключение на занятую задачу.
  9. Переключение на незанятую задачу при выполнении команды IRET.

10) Нарушение правил защиты сегментов.

11) Превышение длины команды в 15 байт.

12) Попытка выполнить привилегированную команду, когда CPL  0.

13) Попытка записать 1 в зарезервированные биты MSR регистров.

14) Использование шлюза, который содержит нуль-селектор.

15) Использование в дескрипторе шлюза селектора, который не ссылается на размер команд.

16) Попытка использовать нуль-селектор для межсегментных переходов.

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


Тип 14 (#PF). Ошибка обращения к странице. Имеет место при страничном преобразовании адресов в следующих случаях:
  1. Бит присутствия Р = 0 в указателе таблицы или страницы.
  2. Нарушение правил защиты страниц.


Формат кода ошибки для этого прерывания содержит биты, которые имеют следующее значение:

Р = 0, если прерывание вызвано отсутствием страницы, Р = 1, если прерывание вызвано нарушением правил защиты страниц;

W/R = 0, если прерывание произошло при чтении страницы, W/R = 1, если при записи на страницу;

U/S = 0, если прерывание произошло при работе процессора в режиме супервизора, U/S = 1, если прерывание произошло при работе в режиме пользователя;

RSVD = 0, если прерывание #PF произошло из-за того, что процессор обнаружил 1 в зарезервированных полях указателя таблицы или указателя страницы, RSVD = 1 при других причинах прерывания.


В регистр CR2 процессор заносит линейный адрес, приведший к прерыванию #PF.


Тип 16 (#MF). Прерывание FPU. Реализуется при различных видах ошибок при обработке чисел с плавающей точкой.


Тип 17 (#AC). Ошибка выравнивания. Возникает при нарушении правил выравнивания операндов, которые процессор проверяет, если в регистре EFLAGS установлено значение признака АС = 1 и в регистре CR0 бит АМ = 1. Прерывание реализуется в случае нарушения следующих правил формирования адреса операнда:

  1. Адрес должен быть кратным 2 при выборке слова, селектора или 32-разрядного дальнего (far) указателя.
  2. Адрес должен быть кратным 4 при выборке двойного слова, числа с плавающей точкой одинарной точности 48-разрядного дальнего (far) указателя, 32-разрядного ближнего (near) указателя или битовой строки.
  3. Адрес должен быть кратным 8 при выборке числа с плавающей точкой двойной точности или числа с плавающей точкой расширенной точности.


Процессор всегда заносит в стек нулевой код ошибки при вызове прерывания #AC.


Тип 18 (#МС). Машинный контроль. Обеспечивает контроль работы процессора с помощью специализированных (модельно-специфических) регистров MSR.

Тип 19 (#ХМ). Прерывание SSE. Реализуется при различных видах ошибок, возникающих при выполнении различных SSE-команд.