Процесс выборки и выполнения последовательности команд может быть прерван для выполнения обслуживания одного из событий, возникшего во время выполнения программы. Это связано с выполнением микропроцессором специальной аппаратной функции - прерывания.
Прерывание – это аппаратная функция микропроцессора, позволяющая ему во время выполнения программы, единым образом реагировать на различные внутренние и внешние асинхронные события, которые возникают в процессе работы компьютера. За счет выполнения процедуры прерывания, процессор прерывает выполнение текущей программы и переходит к выполнению другой программы, которая обслужит событие, вызвавшее данное прерывание. Возврат из программы обслуживания осуществляется за счет выполнения в конце этой программы команды процессора IRET (возврат из прерывания).
События, вызывающие прерывания, - это:
Все события, вызывающие прерывания, пронумерованы от 0 через единицу до FF (256 событий). За каждым событием жестко закреплен вектор прерывания (в режиме реального адреса - четыре байта ОЗУ). В векторе прерывания хранится программный адрес (базовый адрес сегмента памяти и смещение) начала программы обслуживания данного события.
Под векторы прерывания в режиме реального адреса (в этом режиме работают все микропроцессоры от 80286 до Pentium 4 после включения электропитания) отводится область ОЗУ с 0 до 400h (256 векторов х 4 байта = 1024 байта). Адрес вектора прерывания (АВП) – это адрес младшего из четырех байтов вектора прерывания. АВП = (номер события вызывающего прерывание) х 4. Для обслуживания прерываний выделяется и используется небольшая область оперативной памяти, которую называют стек.
Стек – это область оперативной памяти, предназначенная для хранения данных, имеющих временную ценность, например, сохраняется текущее состояние микропроцессора, необходимое для возврата по команде IRET в прерванную ранее программу. Запись в стек выполняется с авто-уменьшением адресов, а чтение с авто-увеличением адресов (принцип: «первым пришел – последним ушел»). Физический адрес для обращения в стек формируется из содержимого регистров процессора (SS : SP). При выполнении записи в стек содержимое регистра SP автоматически уменьшается на 2, а затем используется в качестве смещения при вычислении физического адреса. При обращении по чтению в стек содержимое регистра SP используется в качестве смещения при вычислении физического адреса, а затем к регистру SP автоматически прибавляется 2. Обращение в стек может быть выполнено во время выполнения микропроцессором аппаратной функции (например, прерывание) и по командам микропроцессора (например, PUSH , POP).
Сигналы IRQ n
Сигналы IRQ n (Interrupt ReQuest - запрос прерывания) - сигнал от одного из узлов компьютера, требующий внимания процессора к этом узлу. Сигнал генерируется при наступлении какого-либо события (например, нажатии клавиши, завершении операции чтения/записи на диске и т.п.). Например, в однопроцессорном варианте ПК предусмотрено 15 линий IRQ, часть которых используется внутренними контроллерами системной платы, а остальные заняты стандартными адаптерами либо не используются:
0 - системный таймер (канал 0)
1 - контроллер клавиатуры
2 - сигнал с выхода починенного контроллера прерываний
3 - обычно COM2/COM4
4 - обычно COM1/COM3
5 - параллельный порт LPT2
6 - контроллер FDD
7 - параллельный порт LPT1
8 - часы реального времени с автономным питанием (RTC)
9 - параллельна IRQ 2
10 - резерв для устройств
11 - резерв для устройств
12 - обычно контроллер мыши типа PS/2
13 - математический сопроцессор
14 - обычно контроллер Primary IDE HDD (первый канал)
15 - обычно контроллер Secondary IDE HDD (второй канал)
Процессор управляет внешними устройствами, выполняя соответствующую программу ввода/вывода, где он с помощью команд IN,OUT (чтение порта, запись в порт) имеет доступ к программно-доступным регистрам контроллера. В регистр управления процессор записывает команду, из регистра состояния читает информацию о состоянии устройства и контроллера, в регистр данных записывает выводимые на устройство данные, или читает из регистра данных считываемую с устройства информацию. Возможны два способа организации программного обмена с внешними устройствами:
1) обмен с опросом готовности устройства.
Выполняя программу ввода-вывода, процессор, запустив в контроллере операцию, циклически читает регистр состояния контроллера. Он ожидает появления (в соответствующем разряде регистра состояния) признака готовности к обмену данными с процессором. При появлении этого признака в регистре состояния, процессор, с помощью команды OUT, осуществляет запись в регистр данных (при выводе на устройство), или выполняет чтение информации из регистра данных контроллера с помощью команды IN (при вводе с устройства). После чего запускает в контроллере следующую операцию в контроллере и т. д.;
2) обмен по запросам на обслуживание устройства (запросам на маскируемое прерывание).
При обслуживании внешних устройств через прерывания, процессор, выполняющий программу ввода-вывода, запускает в контроллере операцию и не ожидает готовности контролера к обмену данными. Он продолжает выполнять полезную программу. Контроллер внешнего устройства в случае полной готовности к обмену данными с процессором выдает на соответствующую линию IRQ сигнал запроса на обслуживание. Процессор, через выполнение процедуры прерывания по сигналу IRQ (в ее выполнении участвуют контроллер прерываний и контроллер шины), переходит на выполнение программы ввода/вывода для данного устройства. Эта программа осуществляет обмен данными через регистр данных контроллера и запускает в контроллере следующую операцию и т. д. Процессор возвращается к выполнению прерванной программы через выполнение команды IRET (возврат из прерывания, которой заканчивается программа ввода/вывода) и т. д.
Прерывания и исключения нарушают нормальный ход выполнения программы для обработки внешних событий или сообщения о возникновении особых условий или ошибок. Прерывания подразделяются на аппаратные (маскируемые и немаскируемые), вызываемые электрическими сигналами на входах процессора, и программные, выполняемые по команде INT хх. Программные прерывания процессором обрабатываются как разновидность исключений. Аппаратные прерывания подразделяются на маскируемые и немаскируемые. Процессор может воспринимать прерывания после выполнения каждой команды, длинные строковые команды имеют для восприятия прерываний специальные окна.
Маскируемые прерывания вызываются переходом в высокий уровень сигнала на входе INTR (Interrupt Request) при установленном флаге разрешения (IF=1). В этом случае процессор вырабатывает два следующих друг за другом (back to back) цикла подтверждения прерывания, в которых контроллером шины генерируются управляющие сигналы INТА# (Interrupt Acknowledge). Высокий уровень сигнала INTR должен сохраняться по крайней мере до подтверждения прерывания. Первый цикл подтверждения прерывания обеспечивает выполнение контроллером прерываний процедуры арбитража запросов на прерывание и формирование номера прерывания. По второму импульсу INТА# внешний контроллер прерываний передает по системной шине в процессор сформированный им номер прерывания, обслуживающего данный тип аппаратного прерывания. Прерывание с полученным номером вектора выполняется процессором так же, как и программное (свое текущее состояние (IP, CS, F) процессор сохраняет в стеке, из номера прерывания формирует АВП, читает из вектора прерывания программный адрес (IP:CS) первой исполняемой команды программы обслуживания прерывания, формирует из IP:CS физический адрес и читает команду по этому адресу). Обработка текущего прерывания может быть в свою очередь прервана немаскируемым прерыванием, а если программа-обработчик установит флаг IF, то и другим маскируемым аппаратным прерыванием.
Немаскируемые прерывания выполняются независимо от состояния флага IF по сигналу NMI (Non Mascable Interrupt). Вход NMI процессора асинхронный с запуском по фронту сигнала (переход от низкого уровня к высокому), который вызовет прерывание с типом (номером) 2. Немаскируемое прерывание выполняется так же, как и маскируемое. Его обработка не может прерываться под действием сигнала на входе NMI до выполнения команды IRET.
Исключения (Exceptions) подразделяются на отказы, ловушки и аварийные завершения. Отказ (fault) - это исключение, которое обнаруживается и обслуживается до выполнения инструкции, вызывающей ошибку. После обслуживания этого исключения управление возвращается снова на ту же инструкцию (включая все префиксы), которая вызвала отказ. Отказы, использующиеся в системе виртуальной памяти, позволяют, например, подкачать с диска в оперативную память затребованную страницу или сегмент. Ловушка (trap) - это исключение, которое обнаруживается и обслуживается после выполнения инструкции, его вызывающей. После обслуживания этого исключения управление возвращается на инструкцию, следующую за вызвавшей ловушку. К классу ловушек относятся и программные прерывания по командам INT xx. Аварийное завершение (abort) - это исключение, которое не позволяет точно установить инструкцию, его вызвавшую. Оно используется для сообщения о серьезной ошибке, такой как аппаратная ошибка или повреждение системных таблиц. Набор и обработка исключений реального и защищенного режимов различны. Под исключения Intel резервирует векторы 0-31 в таблице прерываний, однако в персональных компьютерах часть из них перекрывается системными прерываниями BIOS и DOS. Процедура, обслуживающая прерывание или исключение, определяется по таблице с помощью номера прерывания. Для программных прерываний номер задается командой (или во втором байте команды INT xx), а исключения генерируют и передают номер прерывания внутри процессора. Каждому номеру (0-255) прерывания или исключения в защищенном режиме соответствует элемент в таблице дескрипторов прерываний IDT (Interrupt Descriptor Table). В реальном режиме таблица прерываний содержит двойные слова - программные адреса обслуживающих процедур и после сброса располагается, начиная с нулевых адресов. Командой LIDT можно изменять ее положение в пределах первого мегабайта, а размер (03FFh) может быть уменьшен до 007Fh. При попытке обслуживания прерывания с номером, выходящим за заданный размер таблицы, генерируется исключение типа 8. В защищенном режиме таблица IDT содержит 8-байтные дескрипторы прерываний, может иметь размер от 32 до 256 дескрипторов и располагаться в любом месте физической памяти. Анализ условий обслуживания прерываний и исключений выполняется в следующем порядке (по убыванию приоритета):
Двойной отказ (Double Fault) - исключение 8 - возникает, когда при обработке исключения, связанного с сегментацией (10, 11, 12 или 13), процессор обнаруживает исключение, отличное от отказа страницы (14). Также двойной отказ возникает, если при отработке исключения отказа страницы (типа 14) обнаруживается исключение другого типа. В этом случае тоже исполняется исключение 8. Если во время обслуживания исключения отказа страницы произойдет еще один отказ страницы, то происходит отключение (Shutdown) процессора. Во время отключения никакие новые инструкции не выполняются. Из этого состояния процессор можно вывести только аппаратно сигналом NMI, оставляя его в защищенном режиме, или сигналом RESET, переводящим процессор в реальный режим. Прерывания и исключения процессора, работающего в защищенном режиме, приведены в табл. 1. Исключения реального режима, отличающиеся от защищенного, приведены в табл. 2.
Таблица 1. Прерывания и исключения защищенного режима
Номер |
Функция |
Тип |
0 |
Переполнение при делении на 0 |
Fault |
1 |
Исключение отладки |
Fault / Trap |
2 |
Немаскируемое прерывание (NMI) |
NMI |
3 |
Прерывание отладки (INT 3) |
Trap |
4 |
Прерывание по переполнению (INTO) |
Trap |
5 |
Прерывание по контролю диапазона (BOUND) |
Fault |
6 |
Недопустимый код операции |
Fault |
7 |
Сопроцессор недоступен или переключалась задача |
Fault |
8 |
Двойной отказ |
Abort |
9 |
Нарушение границы сегмента сопроцессором (только 386/387) |
Fault |
10** |
Недопустимый сегмент состояния задачи |
Fault |
11 |
Сегмент отсутствует |
Fault |
12* |
Нарушение границы сегмента стека или сегмент стека отсутствует |
Fault |
13* |
Общее нарушение защиты |
Fault |
14 |
Отказ страницы |
Fault |
15 |
Зарезервирован |
|
16 |
Исключение сопроцессора |
Fault |
17 |
Контроль выравнивания (486+) |
Fault |
18-31 |
Зарезервированы |
|
0-255 |
Программные прерывания INT n |
Trap |
*в реальном режиме имеют другое назначение (см. табл. 2).
** В реальном режиме не возникают, но возможны в V86.
Таблица 2. Исключения реального режима
Номер |
Функция |
8 |
Вектор прерывания не попадает в таблицу |
12 |
Нарушение границы сегмента стека |
13 |
Нарушение границы сегмента данных или кода |
При отработке исключения в защищенном режиме процессор сохраняет в стеке слово кода ошибки (Error Code). Если оно отлично от нуля, то оно содержит селектор дескриптора, с которым связана ошибка.