В этой главе описывается, как 80386 обрабатывает прерывания и
исключительные ситуации в защищенном режиме и режиме виртуального
8086.
В этой главе также описываются входы прерывания и таблица
дескрипторов прерываний (IDT), векторный механизм защищенного ре-
жима (PROTECTED). Обзор этих элементов подобен обзору для
действительного режима (REAL) в гл.6.
Описан каждый тип исключительных ситуаций. Эта глава дает
всестороннее описание каждого типа исключительных ситуаций, сверх
описания в гл.6. Для каждой исключительной ситуации описание
включает его причины в защищенном режиме, ограниченный ряд причин
в действительом режиме или режиме виртуального 8086, и важные
связи между исключительными ситуациями и всеми другими аспектами
архитектуры 80386. Понимание этих связей позволяет программисту
написать подпрограммы, которые могут производить обработку исклю-
чительных ситуаций при условии наихудшего случая.
Следует отметить, что ответы 80386 на прерывания и исключи-
тельные ситуации в защищенном режиме в большинстве случаев те же
самые, что и в действительном режиме. Поэтому полезно возвра-
титься к гл. 6. Отличия защищенного режима заключаются в нес-
кольких дополнительных типах исключительных ситуаций, которые об-
наруживаются в защищенном режиме, и для обработки которых таблица
IDT защищенного режима правильнее, чем таблицы векторов действи-
тельного режима.
Как прерывания, так и исключительные ситуации приостанавлива-
ют текущую операцию 80386 и переключают ее на выполнение обслужи-
вающих подпрограмм для обработки прерываний или исключительных
ситуаций. Различие между прерываниями и исключительными ситуаци-
ями заключается в различие начальных точек. Прерывания начинаются
с внешнего события, поступающего с указанных выводов 80386, тогда
как исключительные ситуации начинаются с условия или проблемы,
обнаруженной внутри 80386.
80386 отвечает на прерывание и исключительные ситуации в за-
щиженном режиме или решение виртуального 8086 идентично. В любом
случае, 80386 обрабатывает события в защищенном режиме (заверше-
ние режима виртуального 8086 при получении синала прерывания или
исключительной ситуации описано в гл.12). В дальнейшем в этой
книге описания прерываний и исключительных ситуаций в защищенном
режиме будут также применимы к режиму виртуального 8086 за исклю-
чением специально упомянутых случаев.
Как и в действительном режиме, прерывания и исключительные
ситуации распознаются в зоне границы между командами, после за-
вершения выполнения одной команды, но перед началом следующей ко-
манды. Это упрощает работу программиста, особено когда он имеет
дело с исключительной ситуацией, т.к. программист не вникает в
нюансы внутренних регистров 80386 и стадий конвейера. 80386 вы-
полняет все требуемые операции по обслуживанию и обрабатывает
прерывание или исключительную ситуацию точно на границе команды.
На одной и той же границе команды могут одновременно возник-
нуть несколько прерываний и исключительных ситуаций. Одновремен-
ные события обсуждаются в конце этой главы.
Прерывания поддерживаются аппаратным механизмом, позволяющим
80386 иметь дело с внешней средой, которая обычно включает раз-
личные внешние события, происходящие с неопределенными интервала-
ми. О появлении таких событий может быть анализировано 80386 с
одного из двух контактов: INTR (вход маскируемого прерывания) или
NMI (вход немаскируемого прерывания). Эти два входных контакта
80386 определены для приема сигналов прерывания. Контакт INTR
указывает активное прерывание, когда он находится в состоянии вы-
сокого уровня. Этот сигнал является программно маскируемым, пре-
рывание разрешено, когда EFLAG IF бит установлен в 1 и запрещено,
когда EFLAG IF сброшен в 0.
Контакт NMI указывает на активное прерывание восходящим фрон-
том, и не требуется, чтобы высокий уровень оставался на этом кон-
такте в течение некоторого длительного периода NMI не маскируется
программно, оно всегда разрешено. NMI обычно резервируется для
наиболее критических прерываний, в условиях, когда прерывание не-
избежно, таких как сбои питания или некорректируемые отказы памя-
ти.
Внутри систем 80386 много периферийных устройств, таких как
диски, таймеры, принтеры и другие, требующие прерываний. Такие
прерывания обычно направляются на вход INTR 80386. Т.к. есть
только один вход INTR, прерывания из многих устройств проходят
через логику, формирующую один сигнал INTR, разделяющий многие
устройства. Чтобы быстро достигнуть ответа на прерывание, жела-
тельно немедленно идентифицировать источник прерывания.
Когда активизируется INTR, немедленная идентификация выполня-
ется через специальный цикл, в течение которого 80386 читает ком-
бинацию с младшего байта шины данных. Такая комбинация (в диапа-
зоне от 00 до FF) называется комбинацией вектора и обеспечивается
чипом контроллера прерываний (8259 А или эквивалентом). Комбина-
ция прерывания указывает 80386 на конкретное устройство, располо-
женное в памяти, переключатель, через который 80386 выбирает пер-
вую команду подпрограммы обработки прерываний.
Когда активизируется NMI, специальный цикл не выполня-
ется, и вектор не считывается. Вектор не считывается, поскольку
NMI автоматически ассоциируется с вектором прерывания 02 Н. Во
время такого прерывания вектор 02h определяется для обслуживания
как вектор критического немаскируемого прерывания; при NMI 80386
передает управление подпрограмме обработки прерывания по вектору
02 Н.
Все прерывания векторизованы через массив переключателей,
расположенных в памяти, IDT. Эта таблица начинается с линейного
адреса, указывающео регистр таблицы дескрипторов прерывания. Таб-
лица состоит из 256 переключателей, индексированных как 0 "перек-
лючатель - 255" переключатель, с соответствующей причине возмож-
ной величиной вектора прерывания. Важно: аппаратный вектор преры-
вания должен иметь номер в диапазоне от 32 до 255. Векторы преры-
вания от 0 до 31 зарезервированы для указанных Intel категорий
исключительных ситуаций. Прерывание 32, следовательно, перенап-
равляется с использованием переключателя 32, прерывание 33 - че-
рез переключатель 33, 34 - через переключатель 34 и т.д., до пре-
рывания 255.
Таблица дескрипторов прерывания приводится на рис.16.1
Замечание: архитектура персонального компьютера IBM нарушает
вышеописанные указания, т.е. аппаратные прерывания не используют
номера векторов от 0 до 31. Основная система ввода/вывода РС ини-
циализирует контроллер прерываний 8259 А с использованием векто-
ров 8-15 для аппаратных прерываний. Потенциально это может при-
вести к конфликтным использованиям различных номеров векторов
прерывания.
IDT может содержать переключатели прерывания, переключатели
ловушек и переключатели задач. Переключатели прерываний и ловушек
передают управление сегменту кода внутри текущей задачи, отличие
состоит в том, что переключатели прерываний вызывают сброс IF в
0, в то время как переключатели ловушек не влияют на TF. Сошлемся
на гл.8 для использования дальнейшей информации об этих типах пе-
реключателей в IDT. Переключатели задач передают управление в со-
вершенно другую задачу, как указано переключателем, и выполнение
начинается в CS: местоположение EIP указывается TSS задачи. Сош-
лемся на гл. 15 для дальнейшего обзора пересылок через переключа-
тели задачи.
Когда в аппаратуре происходит прерывание, DPL упомянутого пе-
реключателя не имеет значения. DPL переключателя не контролирует-
ся во время аппаратных прерываний; прерывания всегда имеют доступ
к переключателю для передачи управления корректирующей подпрог-
рамме прерывания или задаче.
Заметим, что это принуждает к использованию переключателей
прерывания и переключателей ловушек, однако: если происходит
ссылка на переключатель прерывания или переключатель ловушек, DPL
целевого сегмента программы должно быть меньше или равно CPL, так
что инструкция IRET может быть использована в конце подпрограммы
возврата управления в прерванную программу (Если происходит ссыл-
ка на переключатель задач, то привилегированный уровень кода
обслуживания не принуждает CPL, когда происходит прерывание, т.к.
нет никаких отношений между привилегированным уровнем в различных
задачах).
Исключительная ситуация - событие, препятствующее завершению
следующей команды. Это состояние обнаруживается внутри 80386.
Т.к. исключительная ситуация препятствует завершению следующей
команды, это проблематичное состояние. Вдобавок это событие может
обслуживаться подпрограммой обработки исключительных ситуаций.
Каждому типу исключительных ситуаций присваивается номер в
диапазоне от 0 до 31, этот диапазон резервируется Intel для прис-
воения исключительным ситуациям. 80386 признает 15 типов исключи-
тельных ситуаций, каждому из которых присвоен определенный номер.
Оставшиеся номера не используются, но они резервируются для прис-
воения в будущих процессорах Intel.
Несколько типов исключительных ситуаций обнаруживается 80386
в защищенном режиме. Исключительные ситуации могут возникать при
проверке на уровне сегмента, страничном контроле или по разнооб-
разным причинам, таким как несуществующий ход операции или отка-
зочная исключительная ситуация. Таблица 16. 1 иллюстрирует все
15 типов исключительных ситуаций, суммируя все случаи каждого ти-
па.
Для сравнения, таблица 16. 1 также показывает точный список
исключительных ситуаций, обнаруживаемых в действительном режиме.
В таблице представлены точные данные, некоторый весьма странный
код действительного режима вызывает необходимость активизации
исключительной ситуации 8,9,12 и 13 в действительном режиме. Ре-
альный список исключительных ситуаций включает только
0,1,2,3,4,5,6,7 и 16.
Возникновение нескольких типов исключительных ситуаций
действительного ожидания, если система использует особенности
виртуальной памяти, работает в мультизадачном режиме или эмулиру-
ет сопроцессор. Например, в системах виртуальной памяти от раза к
разу происходит отказ страницы. Если система работает в мультиза-
дачном режиме или эмулирует 80287 или 80387 сопроцессоры, может
иметь место ситуация недоступности сопроцессора (ситуация 71,
когда код операции сопроцессора близок к тому, который должен
быть выполнен.
Любая исключительная ситуация может быть атрибутом определен-
ной команды. В зависимости от типа ситуации, однако, она может
сигнализировать непосредственно перед или после ответственной ко-
манды. Когда сигнализация происходит перед командой, ситуация
квалифицируется как ошибка; когда сигнализация происходит после
команды, ситуация квалифицируется как ловушка.
Большинство исключительных ситуаций, особенно те, которые яв-
ляются причиной событий, препятствующих выполнению команды, сиг-
нализируют как ошибки, перед выполнением команды. Только ситу-
ации, сигнализирующие как ловушки, после команды, известны как
отладочные исключительные ситуации (одношаговый флаг TF и
точка прерывания по адресу данных), а также ситуации являются
причиной переключения задач, где возникает проблема благодаря то-
му, что следующая задача и переключаемая задача уже имеют место.
Когда команда вызывает исключительную ситуацию, ситуация
всегда распознается. Нет метода маскирования исключительных ситу-
аций, и маскирование нежелательно.
Хотя исключительные ситуации возбуждаются и распознаются в
течение выполнения команды, они возникают для пользователя и об-
рабатываются на границе команды, потому что состояние 80386 всег-
да сохраняется, как если бы оно было перед командой. Таким обра-
зом, для ситуаций ошибки, где ситуация возникает перед от-
ветственной командой, CS: EIP указывает команде (включая байты
префиксов), что является причиной исключительной ситуации. Это
идеальный случай для подпрограмм обслуживания, которые пытаются
скорректировать ситуацию, т.к. возможно возобновить программу
только выполнением команды IRET как последней команды подпрограм-
мы обслуживания исключительной ситуации.
Ошибочные команды 80386 или сопроцессора вполне могут быть
перезапущены для всех типов исключительных ситуаций, кроме слу-
чая, когда нарушается граница операнда сопроцессора (ситуация 3)
и, при определенных условиях, в ситуации ошибки в сегменте зада-
чи/состояния (ситуация 10). При правильно построенной ОС этих не-
явных случаев можно легко избежать, что дает возможность полной
перезапускаемости. Состояние, необходимое для того, чтобы служить
причиной нарушения границы операнда сопроцессора, также неявно и
неудобно, так что ОС может легко предотвратить его появление.
Подробно см. в гл.16. Ситуация ошибки в сегменте задачи - состо-
яния не допускает повторного запуска, если он служит причиной то-
го, что полностью не существует TSS для целевой задачи при перек-
лючении задач ОС может предодотвратить это состояние, не допуская
пересечения попадания на границу страниц фиксированной порции лю-
бого TSS (фиксированная часть - часть, на которую происходит
ссылки во время переключения задач). Подробнее см. гл.16. Состо-
яние полного несуществования TSS, конечно, перезапускаемо.
Т.о. аппаратура 80386 превышает требования к возможностям пе-
резапускаемости в используемых ОС.
В защищенном режиме типы исключительных ситуаций, которые от-
носятся к определенному сегменту или переключателю, являются при-
чиной кода ошибки, который будет записан в стек подпрограммы об-
работки исключительных ситуаций или задачей. Следует отметить,
что в действительном режиме никакие типы исключительных ситуаций
не записывают в стек код ошибки, даже не типы, которые вырабаты-
вают код ошибки в защищенном режиме. Никакие прерывания не выра-
батывают код ошибки.
Код ошибки, записываемый в стек в защищенном режиме, является
32-битной величиной, когда программа обработки исключительных си-
туаций находится в 32-битном сегменте кода, и является 16-битной
величиной, когда программа обработки исключительных ситуаций на-
ходится в 16-битном сегменте кода.Ожидается, конечно, что почти
все новое программное обеспечение защищенного режима будет охва-
тывать 32-битный код. В любом случае только 16 бит кода ошибки
несут существенную информацию. Для всех типов исключительных си-
туаций, кроме ситуации двойной ошибки (ситуации) и ситуации отка-
за страницы (ситуации 14), рис. 16.2 иллюстрирует форматы кода
ошибки. Там также показано, как в коде ошибки записаны только 16
неопределенных бит, когда этот код записывается в 32-битный стек.
Существуют также примеры, когда код ошибки, записываемый в стек,
только 0, UUUU0000h (см. подробное описание набора команд, прило-
жение В).
Формат кода ошибки схож с форматом селектора. Он содер-
жит поле индекса и TI бит. Однако позиции младших значащих бит, а
не содержащая RPL, содержит I бит и EXT бит:
1. EXT (внешний) бит устанавливается в 1, если причиной
исключительной ситуации является событие, внешнее по отношению к
программе. Внешнее событие - прерывание, которое является причи-
ной исключительной ситуации (ошибки), когда 80386 пытается пере-
дать управление подпрограмме обработки прерываний. Стоит только
выполниться первой команде драйвера, последующие исключительные
ситуации являются причиной того, что обрабатывающая программа -
конечно, внутренняя (вызываемая программными обеспечением) исклю-
чительная ситуация. EXT сброшен в 0, если выполняющееся прог-
раммное обеспечение ответственно за исключительную ситуацию..
2. I (IDT) бит устанавливается в 1, если на индексную часть
кода ошибки ссылается переключатель в IDT. Это происходит в слу-
чае, если переключатель в IDT ответственен за исключительную си-
туацию (например, если ссылающийся переключатель отмечен как не-
существующий (Р=0) или переключателя нет вообще). Бит I сбрасыва-
ется в 0, если на индексную часть кода ошибки ссылается элемент
данных в CDT или LDT.
3. TI (индикатор таблицы) бит имеет значение только когда
I=0, указывая, что на индексную часть ссылается GDT или LDT. В
этом случае с TI указывает, что на индекс ссылается или GDT
(TI=0), или LDT (TI=1), точно также, как TI определен в селекторе
режима защиты. Все вышеописанное применимо ко всем исключительным
ситуациям, кроме двойной ошибки (ситуации 8) и ошибки страницы
(ситуация 14). Во время ситуации 8 код ошибки просто все нули. В
случае отказа страницы код ошибки,проиллюстрированный на
рис.16.3, разработан для того, чтобы вызвать необходимую програм-
му обработки страниц..
Во время ситуации отказа страницы (ситуация 14), полезная ин-
формация об ошибках содержится в регистре CR2 80386, который со-
держит линейный адрес, служащий причиной ошибки. Выставляя этот
адрес, программа обработки ситуации отказа страницы может сос-
латься на элемент директории страницы, таблицы страницы.
Во время ситуации отладки (ситуация 1), регистр DR6 содер -
жит полезную информацию о причинах ситуации, как описано в гл.
17.
Таблица 16.2
Коды ошибки режима защиты
Номер Ситуация Код ошибки в стеке обра-
ботчика исключает ситуацию
в режиме защиты
0 Ошибка деления Нет
1 Ситуация отладки Нет
3 Команда останова Нет
4 Команда INTO, если переполнение
5 Команда BOUNP, если нарушение Нет
границ
6 Недопустимый код операции Нет
7 Недоступен сопроцессор Нет
8 Двойная ошибка Да, но код ошибки - все
нули
19 Переполнение сегмента Да, как на рис. 16.2
операнда сопроцессора
10 Ошибка сегмента задачи/ Да, как на рис. 16.2
состояния
11 Сегмент, загруженный в CS, Да, как на рис. 16.2
DS, ES или GS не присутст-
вует
12 Сегмент, загруженный в SS Да, как на рис. 16.2
не присутствует или нару-
шение границы SS
13 Нарушение общей защиты Да, как на рис. 16.2
14 Отказ страницы - не присут- Нет, информация об
ствует или ошибка использо- ошибке находится в ре-
вания гистре CR2
16 Ошибка арифметического Нет, выполняется FNSTENV
сопроцессора команда (команда сохра-
нения состояния сопро-
цессора), чтобы получить
указатель на неудачную
команду
Замечание: коды ошибки не вырабатываются в действительном режиме.
Описание каждой ситуации содержит шесть пунктов:
- описание,
- режимы 80386, в которых эта ситуация может иметь место (Активные режимы),
- код ошибки, записываемый в стек,
- возможность повторного запуска - либо она желательна, либо
возможна, и сценарий восстановления в наихудшем случае(Перезапускаемость),
- все тонкие отличия от 8086/88,
- комментарии - информация о любых других понятиях, связанных
с данной ситуацией, или полезные советы.
Ситуация 0: ошибка деления
-Описание:эта ситуация, квалифицируемая как ошибка, обнаружи-
вается, когда команда DIV или IDIV пытается выполнить деление на
ноль, или когда результат DIV или IDIV переполняет предназначен-
ный для него операнд. Т.к. ситуация квалифицируется как ошибка,
счетчик команд указывает на неудачную команду деления.
-Активные режимы:действительный, защищенный, виртуального 8086.
В действительном режиме используется вектор 0 и таблица векторов
прерывания действительного режима. В защищенном режиме или режиме
виртуального 8086 используется переключатель 0 в таблице дескрип-
торов прерывания защищенного режима (IDT).
-код ошибки, записываемый в стек в защищенном режиме: нет
-Перезапускаемость: команда, послужившая причиной этой ситуа-
ции, может быть повторена. Конечно, повторный запуск команды бу-
дет снова вызывать исключительную ситуацию, если операнды команды
деления не изменены. Т.о., хорошей стратегией в этой ситуации
должно быть сообщение об ошибке и прекращение неудачной програм-
мы.
-отличия от 8086/88: в 8086/8088 эта ситуация квалифициру-
ется как ловушка. Т.о. в 8086/8088 счетчик команд указывает на
следующую команду. Определение этой ситуации в 80286/80386 как
ошибки дает программе обработки ситуации больше полезной инфор-
мации, т.к. счетчик команд указывает на саму неправильную коман-
ду. Такая ситуация случается нечасто, так что изменения внесенные
с целью улучшения в 80286/80386 для обработки этой ситуации при-
водят к незначительной несовместимости или отсутствию несовмести-
мости.
Ситуация 1: отладка
-Описание: эта ситуация имеет место, когда инициализируется
точка прерывания при отладке (во время выполнения команды, перек-
лючения данных или задачи) или если TF (одношаговый) флаг уста-
новлен. Ситуация квалифицируется как ошибка при прерывании во
время выполнения команды, но определяется как ловушка при преры-
вании по адресу данных, переключения задачи и прерывании при ус-
тановленном флаге внутреннего прерывания (TF).
Отладочный регистр состояния, отладочный регистр 6 (DR6) поз-
воляют программе обработки ситуации при отладке легче определить,
почему она возникла. Отладочный регистр состояния содержит одно-
битные флаги для каждого типа возможных событий, вызывающих эту
ситуацию. Заметим, что некоторые из этих событий - ошибки (ситу-
ация возникает немедленно перед выполнением команды, которая слу-
жит причиной исключительной ситуации при отладке), в то время как
другие события - ловушки (ситуация возникает после команды, кото-
рая служит причиной исключительной ситуации при отладке).
Программа обработки отладочных исключительных ситуаций может
быть вызвана в результате одного из следующих событий, как
указано в регистре DR6:
1. Отладочный регистр 0 (DRO) точка прерывания, возникает как
ошибка, если это точка прерывания программы, и как ловушка, если
это точка прерывания по адресу данных.
2. Отладочный регистр 1 (DR1) точка прерывания, возникает как
ошибка, если это точка прерывания программы, и как ловушка, если
это точка прерывания по адресу данных.
3. Отладочный регистр 2 (DR2) точка прерывания, возникает как
ошибка, если это точка прерывания программы, и как ловушка,если
это точка прерывания по адресу данных.
4. Отладочный регистр 3 (DR3). Точка прерывания, возникает
как ошибка, если это точка прерывания программы, и как ловушка,
если это точка прерывания по адресу данных.
5. Прерывание одношаговой инструкции, служащее причиной уста-
новки TF бита в EFLAG, возникает как ловушка после выполнения
каждой команды.
6. Прерывание переключения задач, служащее причиной установки
T бита в TSS задачи, возникает как ловушка в контексте следующей
задачи.
7. Ошибка благодаря попытке чтения или записи в любой отла-
дочный регистр во время, когда GD в DR7=1. Это указывает, что
внутрисхемный эмулятор, такой как ICE-386, в настоящее время ис-
пользует отладочные регистры в своих целях.
Для более полной информации об использовании отладочных ре-
гистров 80386 см. главу 17.
-Активные режимы: действительный, защищенный, виртуального
8086. В действительном режиме используется вектор 1 в таблице
векторов прерывания действительного режима. Защищенный режим или
режим виртуального 8086 использует переключатель 1 в таблице
дескрипторов прерывания защищенного режима.
-код ошибки, записываемый в стек в защищенном режиме: нет.
-Перезапускаемость: все случаи этой ситуации имеют возможность
повторного запуска. RF (флаг возобновления) позволяет команде с
адресом точки прерывания быть повторно запущенной без немедленной
выработки другой отладочной ситуации ошибки.
-Отличие от 8086/8088: поведение TF, когда в одношаговом режи-
ме выполняется команда INT3, INTn, INTO или BOUND, различно в
80286/80386 и 8086/8088. Когда выполняются эти команды,
80286/80386 сбрасывает TF после того, как первоначальное содержи-
мое EFLAG загружается в стек; это предохранительное свойство, ко-
торое предотвращает выполнение пошагового режима прикладной прог-
раммы через программу обработки прерываний операционной системы.
8086/8088 не сбрасывает TF для этих команд. Вывод: отладчик, на-
писанный для 8086/8088, но пропускаемый на 80286 или 80386, не
будет работать в пошаговом режиме во время выполнения подпрограм-
мы обработки прерываний; скорее всего он выполнится полностью во
время подпрограммы и во время следующей команды главной програм-
мы. Чтобы исправить это, отладчик 80286/80386, использующий TF
для поддержки пошагового режима, должен воспроизвести действие
любой команды прерывания, которая встретилась. Эмуляция требует
построения стека ловушки как при команде прерывания и взятия
следующей команды из точки входа в подпрограмму обработки преры-
вания.
-комментарии: используя отладочные регистры 80386 для ловушек
по данным, используйте свойство прерывания по адресу данных, за-
тем обеспечьте использование свойства точного соответствия точке
прерывания, чтобы гарантировать, что будет произведено прерывание
по точке.
Ситуация 3: команда останова
-Описание: эта ситуация возникает, если выполняется одно-
байтная команда INT3 (код операции СС). Вектор для программы об-
работки ситуации считается частью команды INT3. Следовательно,
эта ситуация считается ловушкой, и счетчик команд продолжает ука-
зывать на команду, следующую за INT3.
-Активные режимы: действительный, защищенный режим виртуально-
го 8086. В действительном режиме используется вектор 3 таблицы
векторов прерывания действительного режима. В защищенном режиме
или режиме виртуального 8086 используется переключатель 3 в IDT
защищенного режима.
-код ошибки, записываемый в стек в защищенном режиме: нет.
-Перезапускаемость: т.к. эта ситуация возникает как ловушка,
команда INTO уже завершена. Программа может быть возобновлена с
команды, следующей за INT3.
-Отличие от 8086/8088: нет.
-комментарии: эта ситуация - единственный путь для выработки
прерывания выполняемой команды в 8086/8088 или 80286. В этой си-
туации обеспечивается совместимость для существующих отладчиков
8086/8088 или 80286, пропускаемых на 80386.
Ситуация 4: команда INTO, если установлен флаг переполнения (OF)
-Описание: эта ситуация возникает, если при выполнении команды
INTO бит OF установлен в 1. Вектором программы обработки ситуации
считается часть команды INTO. Следовательно, ситуация квалифици-
руется как ловушка, и счетчик команд продолжает указывать на ко-
манду, следующую за INTO.
-Активные режимы: действительный, защищенный, виртуального
8086. В действительном режиме используется вектор 4 из таблицы
векторов прерывания действительного режима. В защищенном режиме
или режиме виртуального 8086 используется переключатель 4 в IDT.
-код ошибки, записываемый в стек в защищенном режиме: нет.
-Перезапускаемость: т.к. эта ситуация квалифицируется как ло-
вушка, команда INTO уже завершена. Программа может быть возобнов-
лена с команды, следующей за INTO.
Ситуация 5: команда BOUND при обнаружении выхода за границы
-Описание: эта ситуация имеет место, когда выполняется команда
BOUND, и обнаруживается состояние выхода за границы. Вектором
программы обработки ситуации считается часть команды BOUND. Сле-
довательно, ситуация квалифицируется как ловушка, и счетчик ко-
манд продолжает указывать на команду, следующую за BOUND.
-Активные режимы: действительный , защищенный и режим вирту-
ального 8086. В действительном режиме используется вектор 5 из
таблицы векторов прерывания действительного режима. В защищенном
режиме или режиме виртуального 8086 используется переключатель 5
в IDT.
-код ошибки, записываемый в стек в защищенном режиме: нет.
-Перезапускаемость: т.к. эта ситуация возникает как ловушка,
команда BOUND уже завершена. Программа может быть возобновлена с
команды, следующей за BOUND.
Ситуация 6: недопустимая команда
-Описание: эта ситуация возникает, если процессор начинает вы-
полнять какую-либо команду, не являющуюся законной. Причина может
заключаться в недопустимом коде операции, [mod r/m] или [s-i-b]
байте (байтах) (см. гл.3 Формат команд). Обычно причина заключа-
ется в том, что ошибочная программа пытается вызвать данные. По-
пытка использования префикса LOCK там, где он не может быть ис-
пользован, также служит причиной исключительной ситуации (см.
разрешенные виды команд ниже). В действительном режиме попытка
выполнения команд защищенного режима ARPL, LLDT, LTR, LAR, LSL,
SLDT, STR, VERR или VERW также служит причиной исключительной си-
туации.
-Активные режимы: действительный, защищенный, режим вирту-
ального 8086. В действительном режиме используется вектор 6 таб-
лицы векторов прерываний действительного режима. В защищенном ре-
жиме или режиме виртуального 8086 используется переключатель 6 в
IDT.
-код ошибки, записываемый в стек в защищенном режиме: нет.
-Перезапускаемость: состояние процессора сохраняется, так что
рестарт может быть произведен, допуская, что повторный запуск не-
законной команды имеет какой-нибудь смысл. Наилучшей стратегией в
этом случае будет являться сообщение об ошибке и завершение оши-
бочной программы.
Отличие от 8086/8088: такой исключительной ситуации не существует
в 8086/8088, который расценивает незаконную команду как NOP (ни-
чего не происходит, кроме инкрементации счетчика команд).
Отличие от 8086/8088 и 80286: добавление возможности перемещения
страниц в 80386 сделало необходимым ограничить использование пре-
фикса LOCK для для небольшого набора команд, где защелкивание мо-
жет действительно быть гарантировано. Ситуация недопустимого кода
операции (ситуация 6) вырабатывается иначе. Это ограничение и
исключительная ситуация применяется во всех режимах 80386, не
считая, возможно ли перемещение страниц или желательно.
Префикс LOCK законно может предшествовать только определенным
командам, в особенности тем, которые обменивают регистры данных с
памятью, и некоторые из тех, которые выполняют операции пересылки
в память. Эти виды команд:
XCHG , genreg обмен памяти с регистром 80286 и
80386 авто LOCK эту инструкцию
XCHG genreg, обмен регистра с памятью 80286 и
80386 авто эту инструкцию
ADD , genreg сложение с операндом из памяти
ADC , genreg сложение с использованием флага
переноса
SUB , genreg вычитание операнда из памяти
SBB , genreg вычитание с использованием
флага переноса (заема)
NEG умножение операнда из памяти
на -1
OR , genreg ИЛИ с операндом из памяти
AND , genreg И с операндом из памяти
XOR , genreg исключающее ИЛИ с операндом
из памяти
NOT отрицание операнда из памяти
BTC дополнение битов операнда из
памяти
BTR сброс битов операнда из памяти
BTS установка битов операнда из
памяти
Т.к. перемещение страниц поддерживается 80386, 80386 должен
быть более ограниченным по отношению к префику LOCK, чем 8086 или
80286. В страничной среде, которой может быть обеспечен 80386 нет
путей, чтобы быть уверенным, например, в успешном защелкивании
повторяющейся строковой команды. Например, ОС может вмешаться для
обслуживания отказа страницы, прервав предположительно защелкну-
тую команду. См. стр. для большей информации о префиксе LOCK.
Ситуация 7: арифметический сопроцессор недоступен
-Описание: эта ситуация вырабатывается как ошибка, если про-
цессор начинает выполнять команду сопроцессора, когда EM и МР
флаги указывают, что сопроцессор либо недоступен, либо недоступен
для текущей задачи.
Биты ЕМ и НП полностью контролируются программным обеспечени-
ем. ЕМ бит должен быть установлен, а МР бит - сброшен, когда эму-
лируется сопроцессор. ЕМ бит должен быть сброшен, а МР бит - ус-
тановлен, когда сопроцессор действительно в системе.
TS бит автоматически устанавливается в 1, когда 80386 выпол-
няет переключение задач (см. стр. ). В этом случае следующая
команда сопроцессора приходящей задачи вырабатывает ситуацию не-
доступности сопроцессора (ситуация 7). Обрабатывающая программа
этой ситуации, вероятно, перекачивает состояние сопроцессора в
новую задачу, сбрасывая TS флаг (возможно использованием CLTS ко-
манды), и возвращается к команде сопроцессора. Т.к. флаг TS сбро-
шен, арифметическая команда теперь выполняется без вызова исклю-
чительной ситуации.
-Активные режимы: действительный, защищенный, виртуального
8086. В действительном режиме используется вектор 7 таблицы век-
торов прерывания действительного режима. В защищенном режиме и
режиме виртуального 8086 используется переключатель 7 в IDT.
код ошибки, загружаемый в стек в защищенном режиме: нет.
-Перезапускаемость: все происходящее в этой ситуации переза-
пускаемо.
Отличие от 8086/8088: такой ситуации не существует в 8086/8088,
который не обеспечивает критической ситуации для эмулирования
сопроцессора. В 8086/8088 эмуляция сопроцессора может быть завер-
шена, когда необходимо, заменой или вставкой в об`ектный код явно
заданной команды INTn для каждой команды сопроцессора.
Ситуация 8: двойная ошибка
-Описание: эта ситуация возникает, если обнаружена любая
исключительная ситуация, когда процессор пытается передать управ-
ление обработчику для предыдущей исключительной ситуации 0,10,11,
12 или 13.
-Активные режимы:защищенный. В защищенном режиме используется
переключатель 8 в IDT.
код ошибки, записываемый в стек в защищенном режиме: да, но код
ошибки - все нули.
-Перезапускаемость: команда, служащая причиной предыдущей
исключительной ситуации не может быть провторно запущена, т.к.
обнаружение второй исключительной ситуации препятствует сохране-
нию состояния прерванной программы и загрузке информации о вход-
ной точке обработчика исключительной ситуации. Т.к. в цепочке
исключительных ситуаций некоторая первоначальная информация теря-
ется, повторный запуск далее невозможен. Это причина особой
исключительной ситуации, ситуации 8, предназначенной для таких
условий.
Отличие от 80086/8088: такая ситуация не существует в 8086/8088.
-комментарии: чтобы избежать этой ситуации, нужно обеспечить,
чтобы точки входа в обработчики ситуаций 0, 10, 11, 12 и 13 могли
быть достигнуты без причин для будущей исключительной ситуации.
Чтобы обработать ситуацию 8, нужно обеспечить правильный TSS для
обработчика ситуации 8 обработкой его в различных задачах. Чтобы
это сделать, нужно разместить переключатель задач в позиции 8 в
IDT.
Ситуация 9: нарушение границы сегмента операнда сопроцессора
-Описание: эта ситуация возникает, если процессор обнаруживает
исключительную ситуацию, пока он вовлекается в передачу операнда
для сопроцессора. Эта ситуация может иметь место только при ус-
ловии "завертывании" операнда вокруг 4 Гбайтного сегмента.
-Активные режимы: защищенный. В защищенном режиме используется
переключатель 9 в IDT.
-код ошибки, записываемый в стек в защищенном режиме: нет.
-Перезапускаемость: команда арифметического сопроцессора, слу-
жащая причиной этой ситуации, не является перезапускаемой, т.к.
она уже начала выполняться и изменила состояние сопроцессора в то
время, когда 80386 была обнаружена эта исключительная ситуация.
-Отличие от 8086/8088: такой ситуации не существует в 8086/8088.
- комментарии: этой ситуации можно избежать, не разрешшая опе-
ранду сопроцессора "заворачиваться" вокруг конца 4-Гбайтных сег-
ментов.
Ситуация 10: недопустимый сегмент состояния задачи
-Описание: эта ситуация возникает во время операции переключе-
ния задач, если процессор обнаруживает, что сегмент состояния за-
дачи слишком мал, чтобы содержать фиксированную порцию TSS или
если TSS содержит противоречивую информацию. Эта ситуация сигна-
лизирует как ошибка в контексте уходящей задачи, если TSS уходя-
щей задачи оказывается недопустимым или если TSS приходящей зада-
чи несуществует. Ситуация квалифицируется как ловушка в контексте
приходящей задачи, если TSS приходящей задачи имеет будущие проб-
лемы.
-Активные режимы: защищенный. В защищенном режиме используется
переключатель 10 в IDT.
код ошибки, записываемый в стек в защищенном режиме: записывается
код ошибки, показанный на рис. 16.2. Индекс селектора, содержа-
щийся в коде ошибки, зависит от условий обнаружения, как показано
ниже:
-Перезапускаемость: эта ситуация перезапускаема, если не явля-
ется причиной того факта, что часть фиксированной порции TSS на-
ходится в несуществующей странице. Поэтому следует избегать нару-
шения границ внутри фиксированной порции TSS.
-Отличие от 8086/8088: такой ситуации не существует в 8086/8088.
-комментарии: чтобы гарантировать правильность TSS при обра-
ботке ситуации, обработчик ситуации 10 должен быть задачей, вызы-
ваемой через переключатель задач в позиции 10 TDT. В любой систе-
ме рекомендуется создавать только допустимые дескрипторы TSS с
установкой ограничения дескриптора TSS большего, чем достаточное
для того, чтобы содержать во всяком случае фиксированную часть
TSS и допустимое содержимое самого TSS.
код ошибки Условие, из-за которого ПроверяетсяПроверяется
ситуации 10 каждый TSS, вовлеченный в TSS уходя- TSS прихо-
процессе переключения за- щей задачи дящей зада-
дач является недопустимым чи
TSS индекс + Дескриптор TSS неправиль- Да Да
EXT бит ный (ошибочный тип дес-
криптора или не поддаю-
щийся расшифровке)
TSS индекс + JMP, CALL, INT3, INTn, Да Да
EXT бит INTO или BOUNDS команда
служит причиной пере-
ключения задач, но TSS
приходящей задачи уже
отмечен как занятый
(В=1)
TSS индекс + Команда IRET служит при- Да Да
EXT бит чиной переключения задач
на приходящую задачу, в
которой текущая задача,
вероятно, вложена, но
приходящая задача отме-
чена как незанятая
(В=0)
TSS индекс + Ограничение в 32-битном Да Да
EXT бит дескрипторе TSS меньше
103 (десятичное) байтов,
требуемых для фиксиро-
ванной порции TSS (или
меньше, чем 43 десятич-
ное для 16-битного дес-
криптора TSS)
LDT индекс + Недопустимый дескриптор Нет Да
EXT бит LDT или дескриптор LDT
отмечен как несуществу-
ющий
SS индекс + Селектор сегмента стека Нет Да
EXT бит вне ограничения таблицы
дескриптора
SS индекс + Селектор сегмента стека Нет Да
EXT бит не ссылается на сегмент
записи данных
SS индекс + DPL сегмента стека не Нет Да
EXT бит соответствует новому CPL
(указанному RPL селек-
тора новой программы)
SS индекс + RPL селектора сегмента Нет Да
EXT бит стека больше или меньше
нового DPL
CS индекс + Селектор сегмента про- Нет Да
EXT бит граммы вне ограничения
таблицы дескриптора
CS индекс + Селектор сегмента про- Нет Да
EXT бит граммы не ссылается на
сегмент программы
CS индекс + DPL несогласующегося сег- Нет Да
EXT бит мента программы больше
или меньше нового CPL
CS индекс + DPL согласующегося сег- Нет Да
EXT бит мента программы больше
нового CPL
DS,ES,FS,GS Селектор сегмента DS,ES, Нет Да
индекс + FS или GS вне ограничения
EXT бит таблицы дескриптора
S,ES,FS,GS Селектор сегмента DS,ES, Нет Да
индекс + FS или GS не ссылается на
EXT бит сегмент данных
Замечание:" + " имеет дополнительное значение операции булевского
ИЛИ, используемого в формате кода ошибки, см. рис.
16.2.
Ситуация 11: сегмент не существует
Описание: эта ситуация возникает, если процессор обнаружива-
ет, что бит наличия во всех дескрипторах для CS, DS, ES, FS, GS
или LDT, или в переключателе ловушек, переключателе прерываний
или переключателе задач. Эта ситуация квалифицируется как ошибка
при попытке загрузки селектора несуществующего дескриптора в ре-
гистре сегмента. Эта ситуация квалифицируется как ошибка при по-
пытке использования селектора несуществующего переключателя в
межсегментном JMP, межсегментном CALL, межсегментном RET, межсег-
ментном RETn, INT3, INTn, INTO, BOUND, IRET, MOV в DS/ES/FS/GS
или LDS/LES/LFS/LGS.
Особое рассмотрение для обнаружения ситуации несуществования во
время переключания задач: ситуация наихудшего случая
Если ситуация обнаруживается во время переключения задач, та-
кая ситуация квалифицируется как ловушка в контексте приходящей
задачи. Во время переключения задач 80386 во-первых устанавлива-
ет, что TSS приходящей задачи существует и что его LDT (какой-ли-
бо) существует, загружжает все регистры из нового TSS и затем
один за другим считывает дескрипторы, указывающие на селекторы
для каждого регистра сегмента. Если какой-нибудь необходимый
дескриптор не существует, немедленно возникает исключительная си-
туация (ловушка) в контексте новой задачи. (Об`яснение: переклю-
чение задач происходит, но первая команда новой задачи, однако,
не выполняется . Поскольку это происходит, оставшиеся кэш и
дескрипторов не могут быть изменены содержимым необходимого
дескриптора. Существует два пути чтобы скопировать их в обработ-
чик ситуации несуществования (ситуации 11):
1. Обработка этой ситуации с отдельной задачей (переключатель
задач в позиции 11 IDT). Задача переключается обратно на прерван-
ную задачу, что послужит причиной того, что процессор перезагру-
зит регистры и кэши дескрипторов для прерванной задачи. Попытка
переключения может, однако, обнаружить будущую исключительную си-
туацию, которая будет векторизована соответственно. Когда все
исключительные ситуации, вызванные переключением задач, обработа-
ны, обратное переключение на прерванную задачу происходит гладко.
2. Обработка этой ситуации внутри текущей задачи (переключа-
тель ловушек в позиции 11 в IDT) и гарантия того, что обрабатыва-
ющая подпрограмма сделает все кэши дескрипторов согласующимися с
величинами селектора тех, которые были загружены во время перек-
лючения задач. Следовательно, подпрограмма должна загрузить в
стек и затем считать из стека все селекторы регистра сегмента.
Операция POP послужит причиной того, что 80386 считает необходи-
мый дескриптор и изменит соответствующий кэш дескриптора. Из-
вестно,что каждая такая команда POP внутри обработчика может пос-
лужить причиной какой-либо другой ситуации несуществования или
какой-либо другой исключительной ситуации. Следовательно, обра-
ботчик этой ситуации должен допускать возможность повторного вхо-
да (все его временные изменения должны быть сохранены в стеке об-
работчика).
Активные режимы: защищенный. В защищенном режиме используется
вентиль 11 в IDT.
Код ошибки, записываемый в стек в защищенном режиме: код ошибки,
как на рис. 16.2, записывается в стек. Индексная область ссылает-
ся на селектор несуществующего дескриптора или на селектор или
IDT индекс несуществующего переключателя. Бит I установлен, если
код ошибки ссылается на элемент IDT, являюшийся результатом, нап-
ример, команды INTn, ссылающейся на несуществующий переключатель,
или аппаратного прерывания, ссылающегося на несуществующий перек-
лючатель (EXT бит также устанавливается в этом случае).
Перезапускаемость: все происходящее в этой ситуации переза-
пускаемо. Если обработчик ситуации 11 делает сегмент или переклю-
чатель существующим (Р=1) и выполняет IRET, будет возобновлено
выполнение прерванной программы.
Отличие от 8086/8088: такой ситуации не существует в 8086/8088.
Ситуация 12: ошибка стека
Описание: эта ситуация возникает, когда не существует сегмент
стека происходит превышение ограничения сегмента стека.
Ситуация квалифицируется как ошибка, если она обнаружена, по-
тому что нарушено ограничение, при этом счетчик команд указывает
на неудачную команду.
Ситуация квалифицируется как ошибка, когда команда пытается
загрузить селектор несуществующего дескриптора в SS (сегмента
стека) регистр. Это может произойти при межуровневом CALL, межу-
ровневом RET, межуровневом RETn, межуровневом INTn, межуровневом
IRET, команде LSS или MOV или POP в SS.
Особое рассмотрение для обнаружения стековой заключительной
ситуации во время переключения задач: ситуация наихудшего случая
Если обнаружено, что стек не существует, в него невозможна
запись или некорректный уровень привилегий во время переключения
задач, такая ситуация квалифицируется как ловушка в контексте
приходящей задачи. Во время переключения задач 80386 во-первых
устанавливает, что TSS приходящей задачи существует, что LDT (ес-
ли несколько) существует, загружает все регистры из нового TSS и
затем один за другим считывает дескрипторы, указанные селектором
в каждом регистре сегмента. Если обнаружено, что SS дескриптор не
существует, такая исключительная ситуация немедленно квалифициру-
ется как ловушка в контексте новой задачи. (Об`яснение: переклю-
чение задач происходит, но первая команда новой задачи еще не вы-
полнена). Поскольку это происходит, оставшиеся кэши дескрипторов
не могут быть изменены содержимым необходимого дескриптора. Су-
ществует два пути, чтобы скопировать их в обработчик ситуации 12:
1. Обработка этой ситуации с отдельной задачей (переключатель
задач IDT). Переключение задачи обработки в прерванную задачу бу-
дет являться причиной того, что процессор перезагрузит регистры
и кэш дескрипторов для прерванной задачи. При попытке переключе-
ния задач может, однако, возникнуть исключительная ситуация, ко-
торая будет соответственно векторизована. Когда все исключи-
тельные ситуации, вызванные переключением задач, будут обработа-
ны, обратное переключение на прерванную задачу происходит гладко.
2. Обработка этой ситуации внутри текущей задачи (переключа-
тель ловушек в позиции 12 IDT) и гарантия того, что обрабатыва-
ющая подпрограмма сделает все кэш дескрипторов согласующимися с
величинами селектора тех, которые были загружены во время перек-
лючения задач. Следовательно подпрограмма должна загрузить в стек
и затем считать из стека все селекторы регистра сегмента. Опера-
ция POP послужит причиной того, что 80386 считает необходимый
дескриптор и изменит соответствующий кэш дескриптора. Известно,
что каждая такая команда POP внутри обработчика может послужить
причиной какой-либо другой ситуации несуществования (ситуации 11)
или некоторой другой ситуации. В будущем ситуация 12 может про-
изойти, однако, обработчик ситуции 12 может допускать возможность
повторного входа.
Активные режимы: действительный, защищенный, виртуального
8086. В действительном режиме используется вектор 12 таблицы век-
торов прерывания действительного режима. В защищенном режиме ис-
пользуется переключатель 12 в IDT. Эта ситуация обычно не проис-
ходит в действительном режиме, но может быть вызвана созданием
ситуации, когда операнд стека окажется частично за ограничением
64-битного сегмента действительного режима при использовании пре-
фикса размера адреса, для создания 32-битного адреса стека, выхо-
дящего за ограничение 64 К сегмента действительного режима.
код ошибки, записываемый в стек в защищенном режиме: код ошибки,
записываемый в стек, если исключительная ситуация вызвана тем,
что сегмент стека не существует. Если ситуация возникает благода-
ря тому, что нарушено ограничение сегмента стека, код ошибки -
все нули.
Перезапускаемость: все происходящее в этой ситуации переза-
пускаемо. Если обработчик ситуации 12 делает сегмент стека су-
ществующий (Р=1) или расширяет его границы как требуется и выпол-
няет IRET, прерванная программа будет снова выполняться.
Отличие от 8086/8088: такой ситуации не существует в 8086/8088.
Тот факт, что ситуация 12 может быть вызвана в действительном ре-
жиме или режиме виртуального 8086 (при нарушении ограничения)
практически не имеет отношения к программному обеспечению 8086.
Ситуация 13: общая защита
Описание: эта ситуация возникает, если процессор обнаруживает
нарушение защиты, не покрываемое другими исключительными ситуаци-
ями. Возможные причины заключаются в попытке выполнения одного из
следующих действий:
В случаях 1-6 в стек записывается код ошибки, показанный на
рис. 16.2.
1. Передача управления к невыполняемому сегменту, если селек-
тор CS не приходит из приходящей задачи во время переключения за-
дач, т.к. в этом случае имеет место ситуация 10.
2. Загрузка SS регистра из сегмента только для чтения с
дескриптора выполняемого сегмента, если селектор SS не приходит
из приходящей задачи во время переключения задач, т.к. в этом
случае имеет место ситуация 10.
3. Загрузка SS, DS, ES, FS или GS регистров дескриптора сег-
мента системы, если SS селектор не приходит из приходящей задачи
во время переключения задач, т.к. в этом случае имеет место ситу-
ация 10.
4. Загрузка DS, ES, FS или GS с дескриптора выполняемого сег-
мента, который также не читаемый.
5. Передача управления сегменту или через переключатель, в
котором нарушены правила привилегий, или загрузка SS, DS, ES, FS
или GS из сегмента, в котором нарушены правила привилегий.
6. Загрузка регистров CS, SS, DS, ES, FS или GS с селектора,
на который ссылается LDT (селектор с IT=1, когда LDTR был загру-
жен с пустого селектора (LDT неопределен).
В случаях 7-15 в стек записывается код ошибки в виде всех ну-
лей.
7. Загрузка SS регистра с пустого селектора, если пустой SS
селектор не приходит из приходящей задачи во время переключения
задач, т.к. в этом случае имеет место ситуация недопустимого TSS
(ситуация 10).
8. Превышение ограничения сегмента, когда используется CS, DS,
ES, FS или GS.
9. Превышение ограничения таблицы, когда ссылающаяся таблица
дескрипторов GDT, LDT или IDT.
10. Запись в сегмент данных только для чтения или в сегмент
программы (в сегмент программы никогда не производится запись в
защищенном режиме).
11. Считывание из сегмента программы только для выполнения.
12. Выборка из памяти через DS, ES, FS или GS, когда регистр
сегмента содержит пустой селектор.
13. Загрузка CRO с PG=1 и PE=0 (т.е. попытка сделать возмож-
ным страничный действительный режим).
14. Векторизация прерывания или исключительной ситуации через
переключатель ловушек или переключатель прерываний из режима вир-
туального 8086 на уровень привилегий, отличный от 0. Уровень 0
требуется для того, чтобы был установлен определенный уровень,
таким образом IRET команда в конце обрабатывающей подпрограммы
может установить VM бит в 1, как требуется для возвращения в ре-
жим виртуального 8086.
15. Превышение максимальной разрешеной длины команды 15 байт,
включая байты префиксов (это может произойти только при намерен-
ном использовании чрезмерных префиксов перед командой).
Особое рассмотрение для обнаружения ситуации общей защиты во
время переключения задач: ситуация наихудшего случая
Если обнаружение происходит во время переключения задач, си-
туация квалифицируется как ошибка в контексте приходящей задачи.
Во время переключения задач 80386 во-первых устанавливает, что
TSS приходящей задачи существует и что его LDT (если несколько)
существует,загружает все регистры из нового TSS и затем один за
другим считывает дескрипторы, указанные селекторами для каждого
регистра сегмента. Если обнаружено, что любой необходимый
дескриптор не существует немедленно возникает исключительная си-
туация, квалифицируемая как ловушка, в контексте новой задачи.
(Пояснение: переключение задач происходит, но первая команда но-
вой задачи еще не выполнена). Поскольку это происходит, оставши-
еся кэши дескрипторов не могут быть заменены содержимым необходи-
мого дескриптора. Существует два пути, чтобы скопировать их в об-
работчик ситуации 13:
1. Обработка этой ситуации с отдельной задачей (переключатель
задач в позиции 13 IDT). Переключение задачи обратно в прерванную
задачу будет являться причиной того, что процессор перезагрузит
регистры и кэши дескрипторов для прерванной задачи. При попытке
переключения задач может, однако, возникнуть исключительная ситу-
ация, которая будет соответственно векторизована. Когда все
исключительные ситуации, вызванные переключением задач, будут об-
работаны, обратное переключение на прерванную задачу происходит
гладко.
2. Обработка этой ситуации внутри текущей задачи (переключа-
тель ловушек в позиции 13 IDT) и гарантия того, что обрабатыва-
ющая подпрограмма сделает все кэши дескрипторов согласующимися с
величинами селектора тех, которые были загружены во время перек-
лючения задач. Следовательно, подпрограмма должна загрузить в
стек и затем считать из стека все селекторы регистра сегмента.
Операция POP послужит причиной того, что 80386 считает необходи-
мый дескриптор и изменит соответствующий кэш дескриптора. Из-
вестно, что каждая такая команда POP внутри обработчика может
послужить причиной другой ситуации общей защиты или какой-либо
другой ситуации. Следовательно, обработчик этой ситуации должен
допускать возможность повторного входа (все его временные пере-
менные должны быть сохранены в стеке обработчика).
Активные режимы: действительный, защищенный, виртуального
8086. В действительном режиме используется вектор 13 таблицы век-
торов прерывания действительного режима. В защищенном режиме или
режиме виртуального 8086 используется переключатель 13 в IDT. Эта
ситуация обычно не происходит в действительном режиме, но может
быть вызвана созданием ситуации, где операнд частично выходит за
ограничение 64К сегмента действительного режима при использовании
префикса размера адреса, который создает 32-битный адрес, выходя-
щий за ограничение 64К сегмента действительного режима.
Код ошибки, записываемый в стек в защищенном режиме: код ошибки,
показанный на рис. 16.2 записывается в стек, если ситуация воз-
никла в результате загрузки селектора (пункты 1-6). Если ситуация
возникла по другой причине (пункты 7-15), в стек записывается
код ошибки из всех нулей.
Перезапускаемость: все происходящее в этой ситуации переза-
пускаемо.
отличия от 8086/88: такой ситуации не существует в 8086/8088.
Факт, что ситуация 13 может возникнуть в действительном режиме
или режиме виртуального 8086 (намеренное нарушение ограничения)
практически не касается программного обеспечения 8086.
Ситуация 14: отказ страницы
Описание: эта ситуация возникает, если выполняющаяся програм-
ма запрашивает страницу, отмеченную как несуществующую или если
она пытается использовать страницу способом, ограничивающим ее
права выборки. Эта ситуация всегда возникает как ошибка.
Обширная информация об ошибках повышает эффективность алго-
ритмов обработчика. код ошибки, показанный на рис. 16.3, записы-
вается в стек, и системный регистр CR2 содержит лимитный адрес,
который служит причиной отказа страницы.
Активные режимы: защищенный, виртуального 8086. В действи-
тельном режиме используется вектор 14 таблицы векторов прерывания
действительного режима. В защищенном режиме или режиме вирту-
ального 8086 используется переключатель 14 в IDT.
Код ошибки, записываемый в стек в защищенном режиме: код ошибки
при отказе страницы, показанный на рис. 16.3, уникален для этой
ситуации. Он указывает,произошел ли отказ страницы благодаря коду
ошибки при отказе страницы, или при нарушении правил выборки, за-
даваемых уровнем привилегий, при котором происходит отказ страни-
цы, и говорить было ли причиной нарушения чтения или запись.
Перезапускаемость: все происходящее в этой ситуации повторно
запускаемо, т.к. ситуация квалифицируется как ошибка, адрес
возврата, записанный в стек обработчика, указывает на команду,
которая должна быть повторена. Это команда, которая служит причи-
ной исключительной ситуации.
отличия от 8086/88: такой ситуации не существует в 8086/8088.
комментарии: когда инициализируется стек нулевого уровня, ко-
торый необходим обработчику отказа страницы, гарантируется, что
отказ страницы не послужил причиной того, что процессор использу-
ет недопустимый указатель стека SS:ESP. Если инициализируется
стек нулевого уровня в страничной системе, когда возможно замеще-
ние страниц, не используется последовательность двух команд:
MOV SS, AX
MOV ESP, STAK TOP
Причина того, что следует избегать этой последовательности в
том, что т.к. вторая команда должна быть выбрана из памяти и об-
ращается к памяти, возможно получить отказ страницы после того,
как SS изменено, но перед тем, как SP примет соответствующие из-
менения. Отказ страницы в этом случае будет причиной того, что
обработчик отказа страниц (который также на уровне 0) использует
непоследовательный стек, возможно вызывающий крах системы.
Вместо этого программное обеспечение, которое выполняется на
том же самом уровне привилегий, что и обработчик отказа страниц,
должно использовать единственную новую LSS команду лучше, чем
приведенную выше пару команд. В нормальном случае, в котором об-
работчик отказа страниц выполняется на уровне 0, область
действий, требуемая для LSS, ограничивается программой уровня 0,
которая обычно является ОС. Однако новая команда LSS рекомендует-
ся для загрузки SS:ESP на привилегированном уровне. Приведеная
выше последовательность двух команд устарела.
Ситуация 16: ошибка арифметического сопроцессора
Описание: эта ситуация возникает, если контакт ERROR # 80386
активен, когда 80386 пытается инициализировать другую команду
сопроцессора. Когда процессор готовится начать команду сопроцес-
сора опрашивается вход ERROR #, и, если он оказывается активным,
возникает ситуация 16 как ловушка по отношению к команде сопро-
цессора, вызвавшей арифметическую ошибку.
Активные режимы: действительный, защищенный, виртуального
8086. В действительном режиме используется вектор 16 таблицы век-
торов прерывания действительного режима. В защищенном режиме или
режиме виртуального 8086 используется переключатель 16 в IDT.
код ошибки записываемый в стек в защищенном режиме: нет.
Перезапускаемость: все происходящее в этой ситуации переза-
пускаемо с точки зранения 80386, но состояние сопроцессора изме-
няется командой сопроцессора, вызывающей ошибку, и следовательно
повторно не запускаемо. Хорошей стратегией для обработчика явля-
ется выдача сообщения об ошибке и по возможности завершение оши-
бочной программы.
Отличие от 8086/8088: такой ситуации не существует в 8086/8088,
который полагается на сигнал аппаратного прерывания при любой
арифметической ошибке. Архитектура РС, например, использует вход
NMI для сигнализации об арифметической ошибке сопроцессора. Этот
подход может при желании поддерживаться системой 80386, но сигнал
должен держаться не активным, пока арифметический сопроцессор за-
нят.
Прерывания распознаются только на границах команд. Исключи-
тельные ситуации также возникают только на границах команд,либо
как ошибка немедленно перед неверной командой, либо как ловушка
немедленно после неверной команды. Возможно, что несколько преры-
ваний и исключительных ситуаций могут быть активизированы на од-
ной и той же границе команд. Например, аппаратное прерывание,
исключительная ситуация, возникающая как ловушка из предыдущей
команды и исключительная ситуация, возникающая как ошибка перед
следующей командой могут быть активизированы одновременно.
Одновременная активизация прерываний и исключительных ситу-
аций ставит проблему арбитража, обрабатываемую логикой на чипе.
Логика арбитража обеспечивает, что определенные события направля-
ются перед другими, производя установку приоритетов для обработки
возможных событий.
Однако большинство подробных описаний приводят намеченную
последовательность проверок, выполняемых 80386 на каждой границе
команд. Это действие может быть понято как последовательность,
которая подразделяет границу команд на серию шагов. На каждом ша-
ге различные типы активных прерываний и исключительных ситуаций
распознаются. Эта последовательность приоритетов, определенная
аппаратурой на кристалле, обрабатывает все возможные случаи неп-
рерывных событий в порядке, показанном в таблице 16.3.
Таблица 16.3
Подробная последовательность контроля прерываний и исключительных
ситуаций в 80386 на каждой границе команд
Шаг Ф у н к ц и я
1. Проверка на исключительную ситуацию 1 - ловушку (из поша-
гового режима через флаг ловушки или точку прерывания по
адресу данных в отладочных регистрах), выработанную преды-
дущей командой. Если она активна, то ситуация 1 квалифици-
руется как ловушка
2. Проверка внешнего NMI. Если активен, то имеет место преры-
вание 2
3. Проверка внешнего INTR. Если активен, то считывается век-
тор прерывания, и происходит прерывание n (255 > h >0)
4. Проверка на ситуацию 1 - ошибку (из точки прерывания выпол-
нения команды в отладочных регистрах), возможно выработан-
ную следующей командой. Если активен, то возникает ситуа-
ция 1 как ошибка
5. Проверка на ошибку сегментации, возможно выработанную при
выборке следующей команды. Если ошибка обнаружена, то воз-
никает исключительная ситуация (11 или 13) как ошибка
6. Проверка на отказ страницы, возможно возникающий при выбор-
ке следующей команды. Если отказ обнаружен, возникает ис-
ключительная ситуация 14 как ошибка
7. Проверка на ошибки, возможно возникающие при дешифрации
следующей команды. Это будет ситуация 6, если незаконный
код операции или если имеет место команда защищенного ре-
жима, недоступная в действительном режиме; это будет ситу-
ация 13, если в команде более 15 байтов или если команда
требует больших привилегий в защищенном режиме (т.е. IOPL
или PL не 0, как требуется). Если ошибка обнаружена, воз-
никает исключительная ситуация как ошибка
8. Если код следующей команды - WAIT, проверяется TS=1 и
MP=1 в CRO. Если так,то возникает исключительная ситуация
7 как ошибка
9. Если код следующей команды - код команды для арифметиче-
ского сопроцессора, проверяется EM=1 или TS=1. Если так,
то возникает исключительная ситуация 7 как ошибка
10. Если код следующей команды - WAIT или код команды для
арифметического сопроцессора, опрашивается ERROR# вход из
арифметического сопроцессора. Если он активен, возникает
ситуация 16 как ловушка (с точки зрения команды сопро-
цессора, которая выработала арифметическую ошибку)
11. Проверяется порядок для каждого обращения к памяти, тре-
буемого командой:
а) проверка на ошибки сегментации, которые препятст-
вуют передаче целого операнда памяти. Если ошибка имеет
место, возникает ситуация 11, 12 или 13 как ошибка
б) проверка на отказ страницы, который препятствует
пересылке целого операнда памяти. Если отказ имеет мес-
то, возникает исключительная ситуация 14 как ошибка
Заметим, что такой порядок поддерживает положение о том, что
страничный механизм - под механизмом сегментации. Для обращений
к памяти исключительные ситуации, связанные с ошибками сегмента-
ции, если ситуаций несколько, будут вырабатываться перед любыми
исключительными ситуациями, связаными с отказом страницы.
Содержание
Вперед