Для обработки событий, происходящих асинхронно по отношению к выполнению программы, лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции. Например, хорошо спроектированные системы повышенной надежности используют прерывание по аварии в питающей сети для выполнения процедур записи содержи мого регистров и оперативной памяти на магнитный носитель, с тем чтобы после восстановления питания можно было бы продолжить работу с того же места.
Поскольку прерывания возможны самые разнообразные по самым различным причинам, каждому прерыванию присваивается номер прерывания. С каждым номером прерывания связывается то или иное событие. Система умеет распознать какое прерывание, с каким номером произошло, и запускает соответствующую этому номеру процедуру.
1) Типы прерываний. По источнику и характеру возникновения прерывания можно разделить на группы (рис.1):
Программные прерывания вызывают сами программы, поэтому они не являются асинхронными. Для этого они используют команду INT.
Программные прерывания удобно использовать для организации доступа к отдельным общим для всех программ модулям. Прикладные программы сами могут устанавливать свои обработчики прерываний для их последующего использования другими программами. Для этого встраиваемые обработчики прерываний должны быть резидентными в памяти.
Аппаратные прерывания вызываются физическими устройствами и приходят асинхронно. Эти прерывания информируют систему о событиях, связанных с работой устройств.
Внутренние (логические) прерывания формируются самим процессором, когда он встречается с некоторыми особыми событиями вроде деления на 0. Это прерывания с номерами 0, 1, 3, 4. Внешние аппаратные прерывания вызваны сигналами, внешними по отношению к центральному процессору, и подаются на его входы INT и NMI.
Прерывания по входу INT относятся к аппаратным маскируемым прерываниям, поскольку могут быть разрешены или запрещены флагом IF регистра флагов. Обработку аппаратных маскируемых прерываний выполняют контроллеры прерываний, которые принимают запросы на прерывание от нескольких устройств, назначают им приоритеты, выбирают наиболее приоритетные и прерывают работу процессора по входу INT. Номер вектора прерываний маскируемых прерываний передается в процессор по его восьми младшим разрядам шины данных.
Вход немаскируемого прерывания NMI обычно используется для сообщений о "катастрофических" событий (отключении питания, обнаружении ошибок памяти и т.д.). Номер этого прерывания равен 2. Так как номер немаскируемого прерывания заведомо известен, то он не передается в процессор и обработка этого прерывания начинается быстрее, чем обработка маскируемых прерываний. Запрос на прерывание NMI маскируется установкой в 1 старшего 7-го бита порта 70h. При этом остальные биты (6-й бит всегда равен 0, а биты 5 - 0 задают адрес CMOS памяти /см. раздел 4/) должны остаться без изменения. Приоритет NMI выше всех маскируемых прерываний.
2) Таблица векторов прерываний (реальный режим работы). Для того чтобы связать номер прерывания с адресом программы обработки прерываний (обработчика прерываний), используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти - адреса от 0000:0000h до 0000:03FFh. Таблица состоит из 256 элементов - FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смещение, а во втором - сегмент адреса обработчика прерываний. Инициализация таблицы происходит частично программой POST после тестирования аппаратуры, частично при загрузке DOS. DOS может переключить на себя некоторые прерывания BIOS.
3) Обработка прерываний. Несмотря на многообразие типов прерываний алгоритм обработки прерывания процессором один и тот же. N - номер вектора прерывания ? поместить в стек регистр флагов ? обнулить флаги IF и TF ? поместить в стек значение регистра CS ? присвоить адресу вектора прерывания значение N*4 ? загрузить второе слово вектора прерываний в регистр CS ? поместить в стек значение IP ? загрузить первое слово вектора прерываний в указатель команд IP ? выполнить действия по обслуживанию данного прерывания ? извлечь из стека значение и загрузить в указатель команд IP ? извлечь из стека значение и загрузить в регистр сегмента команд CS ? извлечь из стека значение и загрузить в регистр флагов ? Конец.
4) Изменение таблицы векторов прерываний. Если программе потребуется изменить обработку некоторых прерываний, то для этого необходимо переназначить требуемый вектор прерываний на свой обработчик. Это можно сделать, изменив содержание соответствующего элемента таблицы векторов прерываний.
5) Коррекция системных обработчиков прерываний. Если необходимо добавить какие-либо собственные действия к тем, что выполняет стандартный обработчик прерывания, то можно организовать цепочку прерываний.
Программируемый контроллер прерываний ( Programmable Interrupt Controller, PIC) реализуется на микросхеме 8259А фирмы Intel (отечественный аналог КР580ВН59), и на ее модификациях 8259А-2 и 8259А-8, поддерживает 8 уровней прерываний от восьми различных устройств. Основные функции контроллера:
- фиксация запросов на прерывания от восьми внешних источников;
- программное маскирование поступающих запросов;
- присвоение фиксированных или циклически изменяемых приоритетов входам контроллера, на которые поступают запросы;
- инициализация вызова процедуры обработки поступившего аппаратного прерывания.