Принципы организации системы прерывания программ. Прерывания: семейство процессоров Intel 80x86 и MS-DOS
Семейство микропроцессоров Intel 80x86 поддерживает 256 уровней приоритетных прерываний, вызываемых событиями трех типов:
- внутренние аппаратные прерывания
- внешние аппаратные прерывания
- программные прерывания
Внутренние аппаратные прерывания, иногда называемые отказами (faults), генерируются определенными событиями, возникающими в процессе выполнения программы, например попыткой деления на нуль. Закрепление за такими событиями опреденных номеров прерываний зашито в процессоре и не может быть изменено.
Внешние аппаратные прерывания инициируются контроллерами периферийного оборудования или сопроцессорами (например, 8087/80287). Источники сигналов прерываний подключаются либо к выводу немаскируемых прерываний процессора (NMI) либо к выводу маскируемых прерываний (INTR). Линия NMI обычно предназначает для прерываний, вызываемых катастрофическими событиями, такими, как ошибки четности памяти или авария питания.
Вместо непосредственного подключения к ЦП прерывания от внешних устройств могут поступать в процессор через специальное устройство - программируемый контроллер прерываний (РIС) 8259А. ЦП управляет контроллером через набор портов ввода-вывода, а контроллер в свою очередь сигнализирует процессору через вывод INTR. РIС предоставляет возможность программно разрешать и запрещать прерывания от конкретных устройств, а также назначать им приоритеты.
Изготовители компьютерных систем так же, как и изготовители периферийного оборудования, назначают внешним устройствам определенные уровни контроллера прерываний 8259A. Эти назначения выполняются в виде физических электрических соединений и не могут быть изменены программным образом.
Программные прерывания. Любая программа может инициировать синхронное программное прерывание просто путем выполнения команды INT. MS-DOS использует для взаимодействия со своими модулями и прикладными программами прерывания от 20Н до 3FH. (Например, доступ к диспетчеру функций MS-DOS осуществляется выполнением Int 21Н.) Программы BIOS, хранящиеся в ПЗУ, и прикладные программы IBM PC используют другие прерывания, с большими или меньшими номерами. Это распределение номеров прерываний условно и никаким образом не закреплено аппаратно.
Таблица векторов прерываний.
Нижние (с меньшими адресами) 1024 байт системной памяти носят название таблицы векторов прерываний (рис. 1.10). Каждый 4-байтный элемент таблицы соответствует типу прерывания (от 0 до 0FFH) и содержит сегмент и относительный адрес обработчика прерывания данного уровня. Прерывания от 0 до 1FH (самые нижние уровни) используются как прерывания внутренней аппаратуры; MS-DOS использует прерывания от 20Н до 3FH, все остальные прерывания могут использоваться внешней аппаратурой, системными драйверами и прикладными программами.
Если контроллер прерываний 8259А или другое устройство посылает в ЦП прерывание через вывод INTR, оно должно также поместить тип прерывания в виде 8-разрядного числа (от 0 до 0FFH) на системную магистраль для передачи в ЦП. Процессор, умножив это число на 4, определяет адрес используемого вектора прерывания.
Рис. 1.10 Таблица векторов прерываний
Обслуживание прерываний. ЦП, обнаружив сигнал прерывания, помещает в машинный стек слово состояния программы (определяющее различные флаги ЦП), регистр программного сегмента (CS) и указатель команд (IP) и блокирует систему прерываний. Затем ЦП с помощью 8-разрядного числа, установленного на системной магистрали прерывающим устройством, извлекает из таблицы векторов адрес обработчика и возобновляет выполнение с этого адреса.
Состояние системы в момент передачи управления обработчику прерываний совершенно не .зависит от того, было ли прерывание возбуждено внешним устройством или явилось результатом выполнения программой команды INT. Это обстоятельство удобно использовать при написании и тестировании обработчиков внешних прерываний, отладку которых можно почти полностью выполнить, возбуждая их простыми программными средствами.
Обработчики прерываний и MS-DOS. Для установки корректных обработчиков прерываний таким образом, чтобы они не вступали в конфликт с функциями операционной системы или другими обработчиками прерываний, MS-DOS предоставляет специальные средства в виде функций программного прерывания Int 21H, приведенные в таблице 1.1.
Таблица 1.1 Функции MS-DOS для работы с прерываниями
Функция | Действие |
Int 21H, функция 25H | Установить вектор прерывания |
Int 21H, функция 35H | Получить вектор прерывания |
Int 21H, функция 31H | Завершить и оставить резидентной |
Эти функции дают возможность анализировать или модифицировать содержимое таблицы системных векторов прерываний и резервировать память для использования обработчиком, не вступая в конфликты с другими процессами в системе и не нарушая правила использования памяти.
В системе MS-DOS на функционирование обработчиков внешних аппаратных прерываний накладывается ряд весьма жестких ограничений:
- в силу отсутствия свойства повторной входимости у версий MS-DOS обработчик аппаратных прерываний в процессе обработки прерывания не должен вызывать функции MS-DOS
- как только обработчик получает управление, он должен немедленно разблокировать прерывания, чтобы не нарушать работу других устройств и не снижать точность системных часов
Ограничения, накладываемые на функционирование обработчиков прерываний, заменяющих стандартные обработчики MS-DOS для внутренних аппаратных прерываний или системных исключительных состояний (таких, как Ctrl-C или критическая ошибка), не столь жестки, однако программировать обработчики следует все же с большой осторожностью, чтобы не допустить разрушения системных таблиц или перевода операционной системы в неустойчивое состояние.
При составлении программы обработчика прерывания следует иметь в виду правила:
- для модификации вектора прерывания использовать системные функции Int 21H; не записывать в таблицу прерываний непосредственно
- если ваша программа не единственный процесс в системе, использующий данный уровень прерываний, то после выполнения собственной обработки прерывания следует вернуться в предыдущий обработчик, к которому привязан ваш
- если ваша программа не остается резидентной в памяти, следует получить и сохранить текущее состояние вектора прерываний перед его модификацией, а по завершении программы - восстановить исходное содержимое
- если ваша программа остается резидентной в памяти, используйте одну из функций завершения и сохранения в памяти (предпочтительно Int 21H с функцией 31H), чтобы зарезервировать для вашего обработчика требуемый объем памяти
- если вы собираетесь обрабатывать аппаратные прерывания, следует, насколько возможно, сокращать время, в течение которого прерывания заблокированы, а также длину программы обработки прерывания
В приведенном ниже листинге содержится пример установки вектора прерывания по делению на нуль (номер прерывания 0):
. | |
. | |
. | |
mov ah, 25h | ;номер функции |
mov al, 0 | ;номер прервывания |
mov dx, seg zdiv | ;адрес обработчика |
mov ds, dx | |
mov dx, offset zdiv | |
int 21h | ;переход в MS-DOS |
. | |
. | |
. | |
zdiv: | ;обработчик прерывания int 00h |
iret | ;(ничего не делает) |
Дата добавления: 2016-02-20; просмотров: 1754;