Эта глава описывает реакцию 80386 на возникающие в реальном
режиме прерывания и исключения. Как и следует ожидать, в
реальном режиме реакция 80386 очень похожа на реакцию 8086.
Перед более глубоким погружением в реакции процессора опишем
подробно сами события.
Прерывания и исключения - похожие типы событий. Оба
приостанавливают текущую операцию 80386 и передают управление
сервисной программе обработки прерываний или исключений. Они
вызывают переход 80386 от текущего потока команд к сервисной
программе обработки события. Различия между прерываниями и
исключениями возникают из-за различных источников их
возникновения: Прерывания возникают из-за важных внешених
событий, сигналы которых поступают на 80386 на выделенные
контакты; исключения возникают из-за внутренних условий или
проблем, которые детектирует 80386.
С точки зрения программиста, прерывания и исключения
распознаются на границе команд, то есть они распознаются после
того, как одна команда завершилась и перед тем, как следующая
команда началась. Это упрощает жизнь программиста, особенно
при взаимодействии с исключениями, так как он обходится без
нюансов временных внутренних регистров 80386 или состояний
ожидания. 80386 выполняет всю необходимую поддержку и
служебные действия автоматически и обрабатывает прерывания и
исключения ровно на границе команд.
Прерывания обеспечивают аппаратный механизм, позволяющий 80386
взаимодействовать с внешним окружением, которое обычно
включает многообразные внешние события, случающиеся через
непредсказуемые интервалы времени. Наступление такого события
может быть сигнализировано 80386 по одному из двух входов:
INTR (маскируемый вход прерываний) или NMI (немаскируемый вход
прерываний). Эти два входных контакта 80386 посвещены
сигнализации прерываний.
Вход INTR индицирует активное прерывание, управляемое с
высокого уровня. Этот сигнал, который можно маскировать
программно, позволяется, когда IА бит EFLAGа установлен в 1, и
не позволяется, когда он установлен в 0.
Сигнал NMI индуцирует активное прерывание, вызываемое
нарастающим фронтом, и поэтому не требующее, чтобы
поддерживался высокий уровень на длительный период. NMI не
маскируется программно: он всегда позволяется. NMI обычно
резервируется для наиболее критических прерываний, для
прерываний, которые сигнализируют о фатальных условиях, таких
как сбой питания или некорректируемый сбой памяти.
Внутри систем на 80386 многие периферийные устройства, такие
как диски, таймеры, принтеры и другие важные приборы, могут
вызывать прерывания. Такие общие прерывания обычно
направляются на вход INTR 80386. Так как вход INTR только
один, прерывания от многих приборов логически складываются для
формирования сигнала INTR от многих приборов. Чтобы достичь
быстрой реакции на прерывание, желательно сразу же определить
источник прерывания.
Когда активизируется сигнал INTR, сразу же происходит
идентификация благодаря использованию специального цикла, в
течении которого 80386 читает ряд нижних байтов шины данных.
Этот ряд, от 00h до FFh, называется вектором прерываний и
обычно поставляется микросхемой контроллера прерываний, 8239A
или эквивалентной. Номер прерывания указывает 80386 на
конкретный указатель, резидентно находящийся в памяти, -
вектор, с помощью которого 80386 выбирает первую команду
программы обработки прерываний.
Когда, однако, активизируется вход NMI, никакой специальный
цикл не выполняется и вектор не читается, потому что NMI
автоматически связывается с номером прерываний 02h. Для этого
прерывания вектор 02h посвящен обслуживанию критического
немаскируемого вектора прерываний; при возникновении NMI 80386
передает управление программе обработки прерываний с номером02h.
В реальном режиме вектора прерываний являются полными адресами,
в стиле 16-битной адресации: 16-битный селектор и 16-битное
смещение, как показано на рис. 6.1 Вектор прерывания - это
адрес входа в программу, использующуюся для обработки
прерываний. Таким образом, вектор прерываний перенаправляет
80386 на программу обработки прерываний.
Вектор прерываний также служат для передачи управления
80386 в случае определения исключения.
Как было упомянуто, все вектора прерываний являются
резидентами в памяти и образуют массив векторов, называемый
таблицей векторов прерываний. Эта таблица, находящаяся с
линейного адреса 0, состоит из 256 векторов, индексированных
от вектора 0 до вектора 255, что конечно соответствует
возможной величине числа векторов прерываний. Важно: вектора
аппаратных прерываний должны быть пронумерованы от 32 до 255.
Прерывания от 0 до 31 зарезервированы для исключительных
ситуаций, определяемых 80386. Таким образом, прерывание 32
передает управление, используя вектор 32; и так далее до
прерывания 255.
Это иллюстрирует местоположение и размер таблицы векторов
прерываний в реальном режиме после установки. На самом деле,
команда LIDT может быть использована в реальном режиме для
установки базы таблицы векторов прерываний и ее границы, но в
этом случае продолжение работы в реальном режиме создаст его
нестандартное окружение.
Замечание: Архитектура IBM PC противоречит предыдущему
замечанию, т.е. аппартное прерывания не используют номера
векторов от 0 до 32. BIOS PC инициализирует микросхему
контроллера прерываний 8259А для использования векторов 8-15
для аппартных прерываний. Потенциально это может приводить к
конфликтному использованию различных номеров векторов
прерываний.
Таблица векторов прерываний также используется для
перенаправления 80386 в случае определения исключения, как
показано ниже в этой главе.
Программы обработки прерываний - это программы, выполняемые
при передаче управления 80386 согласно таблице векторов
прерываний. Обычно это программы, обслуживающие прибор,
вызвавший прерывание. Данная программа n, для прерывания или
исключения n, может быть активизирована аппаратным или
программным управлением, как показано ниже:
Аппаратное управление. Если маскируемые прерывания позволены
(флаг IF=1), происходит активизирование INTR и выборка вектора
n. Когда высокий уровень на входе INTR активизирует программу
обработки прерываний n, флаг IF устанавливается в 0,
предотвращая дальнейшую активизацию любой программы сигналом
INTR до тех пор, пока флаг IF не будет установлен в 1. Сигнал
NMI активизирует программу обработки прерываний 2, независимо
от значения флага IF.
Когда нарастающий фронт активизирует программу обработки
прерываний 2 по сигралу NMI, флаг IF устанавливается в 0,
предотвращая активизацию любых программ по INTR. Более того,
пока не будет выполнена команда IRET (обычно в конце программы
обработки прерываний 2), другой нарастающий фронт не будет
активизировать эту программу. Это предотвращает порождение
многочисленных вложенных вызовов программы обработки
прерываний 2 при возникновении неровного растущего фронта.
Однако один растущий фронт NMI запоминается, если он возникает
в течениии служебной программы NMI; затем он снова
активизирует программу обработки прерываний 2 как только
закончится первый вызов (если быть более точным, как только он
выполнит команду IRET ).
Замечание по совместимости: 8086 и 8088 не запирают
последующие сигналы NMI после того, как произойдет первый.
Если по некоторой причине вы захотите, чтобы 80286 или 80386
также воспринимал последующие NMI, выполните команду IRET
ранее в программе NMI. Чтобы исполнить IRET находясь в
программе обработки NMI, посторойте сначала кадр стека с тремя
командами PUSH, так что IRET "вернется" к следующей команде.
Программное управление. Выполняется команда INT n независимо
от состояния флага IF. Когда команда INT n активизирует
программу обработки прерываний n, флаг IF не устанавливается;
это позволяет аппаратным прерываниям прерывать программы
обработки прерываний, вызванных программно. Это необходимое
соглашение поддерживает реакцию 80386 на аппаратные средства,
окружающие систему.
Обработка прерываний - это действия 80386 по передаче
управления программе обработки прерываний. При активизации
INTR, эти действия включают чтение с шины номера вектора
прерываний, запоминания состояния текущей программы, чтение
соответствующего вектора прерываний, и переход по адресу,
находящемуся в векторе прерываний. Если прерывание поступает
по NMI или по INTR, в то время, когда прерывания разрешены,
его обработка начинается, как только закончится текущая
команда. При появлении команды INT n, обработка прерываний
выполняется этой командой. Таблица 6.1 излагает шаги при
обработке прерываний, возникающей по сигналам INTR и NMI или
по команде INT n.
Таблица 6.1 Последовательность обработки прерываний
Прерывания, вызванные
INTR NMI INT n
1. Получить число
вектора n из контрол-
лера прерываний, вы-
полнив два специаль-
ных цикла: циклы
"Распознования пре-
рываний"
2.Протолкнуть FLAG 1.Протолкнуть FLAG 1.Протолкнуть FLAG
по стеку по стеку по стеку
3.Протолкнуть CS 2.Протолкнуть CS 2.Протолкнуть CS
по стеку по стеку по стеку
4.Протолкнуть IP 3.Протолкнуть IP 3.Протолкнуть IP
по стеку по стеку по стеку
5.Установить IF 4.Установить IF
в 0 в 0 и запереть NMI
6.Прочесть вектор 4.Прочесть вектор 3.Прочесть вектор
прерываний n. прерываний 2 прерываний n
Поместить селектор Поместить селектор Поместить селектор
в CS и смещение в в CS и смещение в в CS и смещение в
IP IP IP
7.Начать выполнение 5.Начать выполнение4.Начать выполнение
во входной точке во входной точке во входной точке
(CS:IP) (CS:IP) (CS:IP)
Исключения - это внутренние события процессора. Исключения
происходят, когда 80386 определяет проблему, которая мешает
выполнению следующей команды. Распознаются несколько категорий
исключений, и каждой присваевается фиксированное число n в
интервале 0-31. Этот интервал специально зарезервирован под
исключения; прерываниям не должны присваиваться номера из
этого интервала.
В реальном режиме 80386 опознает несколько типов
исключений, как показано ниже. В защищенном режиме и
виртуальном 8086 режиме 80386 опознает дополнительные типы
исключений, описанные в главе 16.
Для обработки этих состояний, также как и прерываний,
требуются обслуживающие программы. Они называются программами
обработки исключений. Таблица векторов прерываний используется
для передачи управления этим программам, в зависимости от
номера n, присвоенного типу случившегося исключения.
Когда команда вызывает исключение, оно всегда распознается.
Нет метода для маскировки исключений, да он и нежелателен.
Хотя исключения возникают и распознаются во время
выполнения команды, исключения проявляются на границе команд,
так как состояние 80386 всегда сохраняется таким, каким оно
было до этой команды. Таким образом CS:IP указывает на команду
(включая байты префиксов), которая вызвала исключение. Это
идеально для служебной программы, устраняющей исключения,
потому что она может вернуться к программе просто выполнив
команду IRET по завершении своей работы.
80386 в реальном режиме распознает 12 категорий исключений,
те же, что в реальном режиме распознает 80286. Из 12
исключений, 5 существуют для 8086, 2 посвящены сообщениям
сопроцессора о численных ошибках, одно для сообщения о
неверном коде команды, и четыре для сообщения различных
нарушений границы сегмента. Краткое изложение дано в таблице
6.2.
Таблица 6.2 Назначение векторов исключений в реальном режиме
N Имя (и тип) Описание Детектируется ли
в реальном 8086/88 режиме
0 Ошибка Была попытка деления да Да, однако
деления на 0 командами DIV 8086 CS:IP
(ошибка) или IDIV указывают на
команду, иду-
щую после DIV
или IDIV
1 Один шаг Если флаг IF в FLAG да Да, но 8086
(ловушка) установлен в 1, это имеет только
Прерывание исключение происходит флаг TF. У
в регистре после следующей ко- него нет ре-
отладки манды. Регистры отла- гистров от-
(ловушка дки могут определить ладки
или ошибка) прерывание, что также
вызывает исключение 1
3 Код преры- Однобайтный код пре- да да
вания рывания (CCh) выпол-
(ловушка) няется. Процессор вы-
зывает исключение 3
4 INTO Если установлен флаг да да
(ловушка) переполнения 0F, про-
цессор вызывает ис-
ключение 4
5 BOUND Если определено нару- да да
(ловушка) шение границ, процес-
сор вызывает исключе-
ние 5
6 Неправильн. Неприсвоенные коды
код команды операций вызывают да Нет, 8086
(ошибка) инициацию 80386 рассматривает
исключения 6 неправильный
код как NOP
7 Сопроцессор Код сопроцессора Да, если Нет, чтобы
недоступен вызывает исключение флаг EM в эмулировать
(ошибка) 7,когда сопроцессор CRO уста- сопроцессор в
недоступен. новлен системе 8086
эмуляцию команд со- в 0 код процессо-
процессора если флаг ра должен
EM в CRO установлен быть заменен
в 0 на команды
INT n, кото-
рые вызывают
обработку
исключения n
8 Двойная Детектируется ошибка Да, но тре нет
ошибка при попытке доступа к бует нетипичного
(ошибка) программам обработки использования
прерываний или исклю. команды LIDT для
чений уменьш. границы
таблицы прерываний
9 Нарушение Операнд для сопроцес- Да, но Нет, 8086 по-
границы сора частично нахо- только зволяет опе-
операнда дится за границей если рандам пере-
сопроцессора сегмента программное ходить за
(ошибка) обеспеч. пе- границу сег-
реносит мента
операнд за
границу 64K
12Исключение Операнд сегмента сте- то же то же
сегмента ка (SS) полностью или
стека частично находится за
(ошибка) границей сегмента.Или
стек не существует.
Или неверный уровень
привилегий. Или не
сегмент данных. А так-
же некоторые другие
примеры, изложенные
в детальном описании
исключения 12
13Исключение Операнд в CS,SS,ES,FS то же то же
общей GS полностью или час-
защиты в CS тично лежит за преде-
SS,DS,ES,FS лами сегмента. Или см
или GS предыдущее исключение
(ошибка)
16Численная Активизируется 80386 Да,если Нет, 8087 сиг-
ошибка ERROR# вход (предпо- вход 80386 нализирует о
сопроцессора ложительно сопроцес- ERROR# был численной
(ошибка) сором) активизи- ошибке сопро-
рован цессора 8086
80387 вы- посредством
ходом со- прерывания
процессора
(обычно через 8259А, но в
архитектуре
PC через NMI
Так как 8086 распознает только пять категорий исключений
у 80386 в реальном режиме могут возникать проблемы
совместимости. Так как исключения, распознаваемые 80386
являются расширением исключений 8086, 80386 является более
различающим, чем его предшественник. Для всех практических
целей поддерживается совместимость, так как дополнительные
исключения 9,12 и 13 (нарушения границы) вызываются только
необычными программами 8086 (например, переносом многобайтного
операнда через начало сегмента), не присутствующими в
коммерческих программах. Дополнение исключения 7, Сопроцессор
недоступен, не является проблемой, потому что техника 8086 по
эмуляции сопроцессора также хорошо работает на 80386.
Исключение 16 происходит только когда сигнал ERROR#
сопроцессора соединен с входным контактом ERROR# 80386;
однако, такое соединение необязательно, и PC, базирующаяся на
80386 не активизирует исключение 16, так как выход
сопроцессора ERROR# посылается на вход процессора NMI, также
как и в PC, базирующихся на 8088.
Дополнительная детальная информация о каждом исключении
приведена в главе 16.
Содержание
Вперед