Принципы организации системы прерывания программ. Прерывания: семейство процессоров 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; просмотров: 1742;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.