Прерывания и исключения
Прерывания и исключения нарушают нормальный ход выполнения программы для обработки внешних событий или команд прерываний.
Прерывания подразделяются на аппаратные, вызываемые электрическими сигналами на входах процессора, и программные, выполняемые по команде INTxx.
Программные прерывания, строго говоря, прерываниями не являются, это лишь своеобразный способ вызова процедур, но процессором они обрабатываются как разновидность прерываний.
По прерыванию или исключению процессор сохраняет в стеке регистр (E)FLAGS и указатель CS:(E)IP на ту инструкцию, которую он должен будет выполнить после обработки прерывания. Этой инструкцией будет следующая за той, во время исполнения которой произошло прерывание. В защищенном режиме при возникновении ряда исключений в стеке сохраняется еще и код ошибки. После сохранения этих значений процессор переходит к исполнению программы обработки данного прерывания (исключения), определяя точку входа в него через номер (0-255) по таблице прерываний. Последней командой обработчика прерывания должна быть инструкция возврата IRET, по которой из стека восстанавливается указатель CS:(E)IP и прежнее значение флагов. Таким образом, процессор по команде прерываний выполняет следующие действия:
1. записывает в стек, по адресу SS:SP-2, содержимое регистра флагов;
2. записывает в стек по адресу SS:SP-4, содержимое сегментного регистра команд.
3. записывает в стек SS по адресу SS:SP-6 содержимое регистра указателя команд IP;
4. запрещает внешние прерывания, IF: = 0;
5. вычисляет адрес вектора прерываний (содержимое регистра АН умножает на 4 и получает адрес вектора, где хранятся CS и IP программы обрабатывающей данное прерывание). Область векторов прерываний находится в памяти с адреса 000H по 3FFH. Причем в каждом векторе, длинной в 4 байта, в двух байтах, по младшим адресам, находится IP, а двух байтах старших адресов CS;
6. выставляет вычисленный адрес на шину адресов и загружает из памяти в регистры CS и IP содержимое вектора;
7. разрешает внешние прерывания, IF: = 1;
8. начинает выполнять базовый цикл работы процессора.
Аппаратные прерывания выполняются по такому же алгоритму иподразделяются на маскируемые и немаскируемые.
Маскируемые прерывания выполняютсяпри установленном флаге разрешения (IF=1).
Немаскируемые прерывания выполняются независимо от состояния флага IF по сигналу NMI (Non Mascable Interrupt). Его обработка не может прерываться до выполнения команды IRET.
Исключения (Exceptions), или особые случаи, подразделяются на отказы, ловушки и аварийные завершения. Различия заключаются в сохраняемых значениях CS:(E)IP.
Отказ (fault) – это исключение, которое обнаруживается и обслуживается до выполнения инструкции, вызывающей ошибку. После обслуживания этого исключения управление возвращается снова на ту же инструкцию (включая все префиксы), которая вызвала отказ.
Ловушка (trap) – это исключение, которое обнаруживается и обслуживается после выполнения инструкции, его вызывающей. После обслуживания этого исключения управление возвращается на следующую инструкцию. К классу ловушек относятся и программные прерывания.
Аварийное завершение (abort) — это исключение, которое не позволяет точно установить инструкцию, его вызвавшую. Оно используется для сообщения о серьезной ошибке, такой, как аппаратная ошибка или повреждение системных таблиц.
В защищенном режиме каждому номеру (0-255) прерывания или исключения соответствует элемент в таблице дескрипторов прерываний IDT (Interrupt Descriptor Table). В реальном режиме таблица прерываний содержит дальние адреса (двойные слова) обслуживающих процедур и после сброса располагается, начиная с нулевых адресов.
Дата добавления: 2016-02-24; просмотров: 926;