Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Лекции Ч1 (Л1-Л7).doc
Скачиваний:
71
Добавлен:
10.11.2019
Размер:
1.93 Mб
Скачать

7.1. Организация прерываний

Для обработки событий, происходящих асинхронно по отношению к выполнению программы, лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции.

Например, хорошо спроектированные системы повышенной надежности используют прерывание по аварии в питающей сети для выполнения процедур записи содержимого регистров и оперативной памяти на магнитный носитель, с тем чтобы после восстановления питания можно было бы продолжить работу с того же места.

Поскольку прерывания возможны самые разнообразные по самым различным причинам, каждому прерыванию присваивается номер прерывания. С каждым номером прерывания связывается то или иное событие. Система умеет распознать какое прерывание, с каким номером произошло, и запускает соответствующую этому номеру процедуру.

Типы прерываний. По источнику и характеру возникновения, прерывания можно разделить на следующие группы, показанные на рис.7.1.

Рисунок 7.1 - Типы прерываний

Программные прерывания (исключения) вызывают сами программы, поэтому они не являются асинхронными. Для этого они используют команду INT. Программные прерывания удобно использовать для организации доступа к отдельным общим для всех программ модулям.

Например, программные модули операционной системы доступны прикладным программам именно через прерывания, и нет необходимости при вызове этих модулей знать их текущий адрес в памяти. Прикладные программы сами могут устанавливать свои обработчики прерываний для их последующего использования другими программами. Для этого встраиваемые обработчики прерываний должны быть резидентными в памяти.

Аппаратные прерывания вызываются физическими устройствами и приходят асинхронно. Эти прерывания информируют систему о событиях, связанных с работой устройств, например о том, что завершилась печать символа на принтере и неплохо было бы выдать следующий символ, или о том, что требуемый сектор диска уже прочитан, его содержание доступно программе.

Использование прерываний при работе с медленными внешними устройствами позволяет совместить ввод/вывод с обработкой данных в центральном процессоре и в результате повышает общую производительность системы.

Внутренние (логические) прерывания формируются самим процессором, когда он встречается с некоторыми особыми событиями вроде деления на 0. Это прерывания с номерами 0, 1, 3,4 (см. табл. 7.1).

Внешние аппаратные прерывания вызваны сигналами, внешними по отношению к центральному процессору, и подаются на его входы INT и NMI

Прерывания по входу INT относятся в аппаратным маскируемым прерываниям, поскольку могут быть разрешены или запрещены флагом IF регистра флагов.

Обработку аппаратных маскируемых прерываний выполняют контроллеры прерываний, которые принимают запросы на прерывание от нескольких устройств, назначают им приоритеты, выбирают наиболее приоритетные и прерывают работу процессора по входу INT.

Номер вектора прерываний маскируемых прерываний передается в процессор по его восьми младшим разрядам шины данных.

Вход немаскируемого прерывания NMI обычно используется для сообщений о "катастрофических" событий (отключении питания, обна­ружении ошибок памяти и т.д.). Номер этого прерывания равен 2.

Так как номер немаскируемого прерывания заведомо известен, то он не передается в процессор и обработка этого прерывания начинается быстрее, чем обработка маскируемых прерываний. Запрос на прерывание NMI маскируется установкой в 1 старшего 7-го бита порта 70h. При этом остальные биты (6-й бит всегда равен 0, а биты 5 - 0 задают адрес CMOS памяти) должны остаться без изменения. Приоритет NMI выше всех маскируемых прерываний.

Таблица векторов прерываний. Для того чтобы связать номер прерывания с адресом программы обработки прерываний (обработчика прерываний), используется таблица векторов прерываний, занимающая в реальном режиме первый килобайт оперативной памяти - адреса от 0000:0000h до 0000:03FFh. В защищенном режиме используется таблица дескрипторов прерываний IDТ. Таблица состоит из 256 элементов - FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смещение, а во втором - сегмент адреса обработчика прерываний.

Прерыванию с номером 0 соответствует адрес 0000:0000h, прерыванию с номером 1 - 0000:0004h и т.д. Прерыванию с номером n будет соответствовать адрес 0000:4*n.

Инициализация таблицы происходит частично программой POST после тестирования аппаратуры, частично при загрузке операционной системы, которая может переключить на себя некоторые прерывания BIOS.

Обработка прерываний. Несмотря на многообразие типов прерываний алгоритм обработки прерывания процессором один и тот же и изображен на рис. 7.2.

Изменение таблицы векторов прерываний. Если программе потребуется изменить обработку некоторых прерываний, то для этого необходимо переназначить требуемый вектор прерываний на свой обработчик. Это можно сделать, изменив содержание соответствующего элемента таблицы векторов прерываний.

Очень важно не забыть перед завершением работы программы восстановить содержимое измененных векторов, т.к. после завершения работы программы память, которая ей была распределена, считается свободной и может быть использована для загрузки другой программы. Если вектор не был восстановлен, и пришло прерывание, то работа системы может нарушиться - вектор теперь указывает на область, которая может содержать все, что угодно. Поэтому последовательность действий для нерезидентных программ, обрабатывающих прерывания, должна быть такой:

Рисунок 8.2 - Алгоритм обработки прерываний

-прочитать содержимое элемента таблицы векторов прерываний для вектора с номером того прерывания, какое требуется обработать;

-запомнить это содержимое (адрес старого обработчика прерываний) в области данных программы;

-установить новый адрес в таблице векторов прерываний так, чтобы он соответствовал началу программы обработки прерываний пользователя;

-перед завершением работы программы прочитать из области данных адрес старого обработчика прерывания и записать его в таблицу векторов прерываний.

Отметим, что для резидентных программ (т.е. программ постоянно находящихся в оперативной памяти) последний пункт выполнять не нужно.

Операция изменения вектора прерываний должна быть непрерывной в том смысле, что во время изменения не должно произойти прерывание с номером, для которого производится замена программы обработки. Если, например, будет записано новое значение смещения, а сегмент адреса не успеет обновиться, то по какому адресу будет передано управления в случае прерывания и что при этом произойдет?

Поэтому перед записью в вектор прерываний нужно запретить прерывания командой CLI, а после записи - разрешить командой STI.

Для облегчения работы по замене прерывания DOS имеет специальные функции для чтения элемента таблицы прерываний и для записи в нее нового адреса. Правильность операций при этом будет гарантирована.

Для чтения вектора используйте функцию 35h DOS (прерывания 21h). Перед ее вызовом регистр AL должен содержать номер вектора в таблице. После выполнения функции в регистрах ES:BX будет искомый адрес обработчика прерывания.

Функция 25h DOS устанавливает для вектора с номером, находящимся в AL, обработчик прерываний DS:DX.

Коррекция системных обработчиков прерываний. Если необходимо добавить какие-либо собственные действия к тем, что выполняет стандартный обработчик прерывания, то можно организовать цепочку прерываний. Для организации цепочки прерываний необходимо записать в таблицу векторов адрес собственного обработчика, не забыв сохранить прежнее содержимое таблицы. Обработчик пользователя получает управление по прерыванию, выполняет какие-либо действия, затем передает управление стандартному обработчику. Можно сделать и по-другому: Обработчик пользователя вызывает стандартный обработчик, а затем выполняет дополнительные действия. Т.е. можно вставить дополнительную обработку как до вызова стандартного обработчика, так и после его вызова.