Лекции по Вычислительным машинам, системам и сетям   

3. Тридцатидвухразрядные процессоры фирмы Intel

3.26. Система прерываний 32-х разрядных процессоров

Как и в любых других процессорах, все прерывания 32-разрядных процессоров можно разделить на внешние, внутренние и программные. Внутренние прерывания принято называть «особыми случаями» (иногда «исключениями»). Рассмотрим именно особые случаи, которые можно разбить на три группы.

1. Нарушение (fault) ‑ МП запоминает в стеке адрес возврата, указывающий на «виноватую» команду. При возврате из обработчика происходит рестарт отказавшей команды.

2. Ловушка (trap) ‑ запоминаемый в стеке адрес возврата указывает на следующую (за «виноватой») команду программы. Рестарта здесь не будет.

3. Аавария (abort) ‑ при аварии некоторый контекст текущей задачи теряется и выполнять ее дальше невозможно. Установить причину аварии также невозмож-но. Единственное, что может предпринять обработчик ‑ сохранить текущее состояние системы и корректно ее отключить (перейти на цикл отключения ‑ shutdown).

Действия процессора при прерывании зависят от того, в каком режиме он находится.

В реальном режиме 32-разрядный процессор выполняет при прерывании те же действия, что и МП 8086. В стеке запоминается содержимое регистра флагов (f) и адрес возврата (cs:ip). Затем по известному типу прерывания в таблице прерываний отыскивается начальный адрес обработчика и управление передается этому обработчику.

В отличие от МП 8086, у которого таблица прерываний фиксирована в младшем килобайте ОП, в реальном режиме имеется возможность, используя команду lidt перемещать эту таблицу в ОП и менять ее размер. Пользователю это отличие не видно, поскольку при инициализации МП для таблицы прерываний задается (в регистре idtr) нулевой начальный адрес и размер 1 Кбайт. У пользователя есть возможность перемещать эту таблицу.

Вторым отличием 32-разрядного процессора от МП 8086 является количество возможных особых случаев. В МП 8086 их было всего четыре (и все они относились к классу ловушек): ошибка деления (тип 0), прерывание по флагу tf (тип 1), прерывание по команде int3 (тип 3) и прерывание по команде into (тип 4). С оговорками сюда же можно отнести прерывание по входу NMI (тип 2), которое хотя и является внешним прерыванием, но имеет алгоритм обработки, типичный для особого случая. В реальном режиме 32-разрядного процессора особых случаев значительно больше.

В защищенном режиме в качестве таблицы прерываний используется таблица IDT. Начальный адрес и размер таблицы задаются в регистре idtr. В этой таблице не может быть ни одного дескриптора, там располагаются только шлюзы. Связано это со следующими соображениями. Прерывание может произойти в любой момент, и когда работаем  на 0-м уровне привилегий, и когда  работаем на 3-м уровне. Следовательно, обработчик должен быть доступен с любого уровня привилегий. А такой доступ может быть обеспечен только через шлюз, причем этот шлюз должен иметь 3-й уровень привилегий.

Имеется еще одно обстоятельство. Как известно, через шлюз можно перейти либо к сегменту с тем же, либо с более высоким уровнем привилегий, чем текущий. К кодовому сегменту с более низким уровнем привилегий получить доступ невозможно. Отсюда вывод: обработчик надо располагать в сегменте с 0-м уровнем привилегий.

При любом прерывании МП автоматически сохраняет в стеке содержимое регистра флагов (ef) и адрес возврата в формате 00cs:eip. Если обработчик располагается в сегменте с более высоким уровнем привилегий, то процессор должен сменить стек на более привилегирован-ный. Вершина старого стека запоминается в новом стеке в формате 00ss:esp. Для некоторых особых случаев в защищенном режиме МП помещает в стек дополнительную информацию, называемую кодом ошибки. При прерывании МП автоматически загружает в стек от 12-ти до 24-х байт. Существуют четыре варианта заполнения стека, приведенные на рис. 3.40.

Формат кода ошибки различен для разных особых случаев. Если особый случай связан с обращением к дескриптору, например нарушены права доступа или сегмент не присутствует в ОП, код ошибки имеет формат, приведенный на рис. 3.41.

Рис. 3.40

31                16

15                  3

2

1

0

Резерв

Селектор

TI

I

EXT

Рис. 3.41

Селектор задает «виноватый» дескриптор в одной из дескрипторных таблиц. Дескрипторная таблица определяется битами TI и I:

I = 1, TI ‑ безразлично ‑  это IDT;

I = 0, TI = 0                       ‑    это GDT;

I = 0, TI = 1                       ‑    то LDT.

Если бит EXT (external – «внешний») равен единице, этот особый случай вызван аппаратным прерыванием или возник при обработке другого особого случая. Обработчик может с помощью кода ошибки прочитать «виноватый» дескриптор и по нему определить конкретную причину особого случая. Иногда МП формирует код ошибки, состоящий из одних нулей. Никакой информации он не несет и его назначение неизвестно. Наконец имеется еще один формат кода ошибки, формируемый процессором при страничном нарушении (тип 14). Этот формат рассмотрим несколько позже.

Действия процессора при прерывании в режиме V86 достаточно подробно обсуждались в разд. 3.11.

Рассмотрим подробное описание особых случаев.

Тип 0 ‑ ошибка деления. Этот особый случай относится к нарушениям. Может возникнуть при выполнении команд деления, если формат результата превышает формат регистра-получателя. С точки зрения МП этот результат является бесконечным, а такое деление эквивалентно делению на ноль.

Тип 1 ‑ особый случай отладки. В реальном режиме может возникать в трех случаях: по флагу tf (это ловушка), по контрольной точке по данным или порту ввода-вывода (тоже ловушка) и по контрольной точке по команде (а вот это ‑ нарушение!). Кроме того, в защищенном режиме возможен еще один случай, когда возникает это прерывание: при переключении задач, если бит Т в TSS входящей задачи установлен в единицу. Последний особый случай является ловушкой. Кода ошибки нет. Напомним, что контрольные точки задаются в регистрах отладки dr0 -dr3. Чтобы установить конкретную причину прерывания типа 1, надо анализировать содержимое регистра dr6.

Тип 2 ‑ прерывание по NMI. Можно отнести к особым случаям с некоторыми оговорками. Так как этот вход опрашивается на границах между командами, то нельзя назвать это прерывание ни ловушкой, ни нарушением.

Тип 3 ‑ прерывание по команде int3 (контрольная точка). Это ловушка. Команда int3 используется при отладке, в частности, ее активно используют различные «дебагеры». Эти команды располагаются в критических местах отлаживаемой программы. Обработчик этого прерывания обычно выводит на экран содержимое внутренних регистров МП. Таким образом, в критических местах программы останавливаемся и смотрим на полученные результаты. Когда программа отлажена, все команды int3 заменяются командами nop (пустая команда). У команды int3 есть аналог ‑ команда int  3, однако первая занимает в памяти один байт, а вторая ‑ два.

Тип 4 ‑ прерывание по команде into. Это ловушка. Возникает, если выполняется команда into и флаг переполнения of установлен.

Тип 5 ‑ выход за границы массива. Может возникнуть только при выполнении команды bound. Команда задает три операнда, два в памяти и один в регистре. Операнды в памяти рассматриваются как верхняя и нижняя границы некоторого массива, а операнд в регистре ‑ как индекс внутри массива. МП проверяет, находится ли этот индекс внутри заданных границ. Если находится, МП переходит к следующей команде, если нет ‑ генерируется прерывание типа 5. Этот особый случай является нарушением.

Тип 6 ‑ неверный код операции. Возникает при неправильном использовании префикса lock, при попытке выполнить в реальном режиме команду, допустимую только в защищенном режиме, при попытке выполнить ММХ – команду на процессоре, который такие команды не поддерживает и т.д. Это нарушение.

Тип 7 ‑ устройство недоступно. Под устройством здесь понимается арифметический сопроцессор. Возникает при попытке выполнить команду сопроцессора или ММХ ‑ команду при ЕМ = 1 или TS = 1 (в регистре cr0). Это нарушение.

Тип 8 ‑ двойная ошибка. Это авария. Код ошибки равен нулю. Возможна ситуация, когда при вызове обработчика какого-либо особого случая происходит еще один особый случай. Например, сегмент, в котором расположен этот обработчик, в ОП отсутствует. Чаще всего МП может обработать оба подряд возникших особых случая последовательно, но иногда это оказывается невозможным. В последнем случае МП генерирует прерывание типа 8 ‑ двойная ошибка. Для того чтобы МП мог отличить двойную ошибку от двух последовательно идущих особых случаев, он делит все особые случаи на три группы: легкие (benign) (типы 1‑7, 9, 16‑18, все программные и все внешние прерывания), тяжелые (contributory) (типы 0 и 10‑13) и страничные (page) (тип 14). Два подряд тяжелых случая, или страничный и тяжелый случаи, или два подряд страничных нарушения и приводят к двойной ошибке. Если при вызове обработчика двойной ошибки возникает третий особый случай (например, переполнение стека), МП генерирует цикл отключения.

Тип 9 ‑ зарезервирован (кроме МП 386).

Тип 10 ‑ недействительный сегмент TSS. В реальном режиме не возникает. Сегмент TSS считается недействительным в достаточно многих случаях. Например, если его размер меньше 104 байт. Этот особый случай является нарушением и для него генерируется код ошибки (с его помощью можно понять, что же конкретно произошло).

Тип 11 ‑ не присутствующий сегмент (кроме сегмента стека). В реальном режиме не возникает. Нарушение есть код ошибки. Возникает при обращении к дескриптору, у которого бит Р установлен в 0.

Тип 12 ‑ нарушение стека. Как и следует из названия, это нарушение. Возникает, если стековая операция выводит за заданные в теневой части регистра ss размеры стека, либо сегмент стека, к которому мы обращаемся, помечен как не присутствующий в ОП. Код ошибки есть.

Тип 13 ‑ нарушение общей защиты. Это нарушение. Код ошибки есть и, если не связан с дескриптором, равен нулю. Причин возникновения этого особого случая очень много (не менее тридцати) и они очень разные. Фирма свела в этот тип все причины прерываний, не вошедшие в другие типы. Перечислим лишь некоторые возможные причины этого особого случая:

- эффективный адрес выводит за заданные размеры сегмента ( кроме сегмента стека, для него тип 12);

- длина команды больше 15 байт;

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

- нарушены атрибуты сегмента;

- нарушены права доступа к сегменту и т.д.

Тип 14 ‑ страничное нарушение ( отказ страницы). В реальном режиме не возникает. Может возникнуть только при включенном страничном механизме. Вызывается этот особый случай следующими причинами:

- таблица или страница не присутствует в ОП (в PDE или PTE бит Р = 0);

- нарушены права доступа к странице.

Нарушение, код ошибки есть и имеет специфический формат, приведенный на рис. 3.42 .

Резерв

U/S

R/W

P

Рис. 3.42

Кроме того, при страничном нарушении МП автоматически загружает «виноватый» линейный адрес в регистр CR2.

Тип 15 ‑ зарезервирован.

Тип 16 ‑ ошибка сопроцессора. Хотя этот особый случай относится к нарушениям, рестарт «виноватой» команды здесь невозможен. Связано это с тем что такое прерывание генерируется не во время выполнения «виноватой» команды, а в начале выполнения следующей команды сопроцессора.

Тип 17 ‑ контроль выравнивания. Появился в МП 486. Возникает, если флаг АС = 1, бит АМ = 1, текущей CPL = 3 и обращаемся к не выровненным данным. Нарушение, код ошибки равен нулю.

Тип 18 ‑ аппаратный сбой. Авария. Введен, начиная с Pentium. Является модельно-зависимым. Причина сбоя возвращается в регистрах MSR. Если бит МСЕ в регистре cr4 установлен в единицу, то при сбое вызывается обработчик, если же МСЕ = 0, то процессор просто переходит в состояние отключения.

Тип 19 ‑ нарушение в SSE команде. Введен, начиная с Pentium III. Является модельно зависимым.



*****
Новосибирск © 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.