Материал: Системное программирование

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Табл. 92. Аппаратные прерывания в порядке приоритета.

Номер

IRQN

Описание прерывания

8

IRQ0

Прерывание таймера, возникает с частотой 18.2 Гц.

9

IRQ1

Прерывание от клавиатуры. Генерируется при нажатии и отпускании клавиши. Используется для чтения данных от клавиатуры.

A

IRQ2

Каскадирование аппаратных прерываний.

70

IRQ8

Прерывание от часов реального времени.

71

IRQ9

Прерывание от контроллера видеоадаптера.

72

IRQ10

Зарезервировано.

73

IRQ11

Зарезервировано.

74

IRQ12

Зарезервировано.

75

IRQ13

Прерывание от математического сопроцессора.

76

IRQ14

Прерывание от контроллера жесткого диска.

77

IRQ15

Зарезервировано.

B

IRQ3

Прерывание асинхронного порта COM2.

C

IRQ4

Прерывание асинхронного порта COM1.

D

IRQ5

Прерывание от контроллера жесткого диска.

E

IRQ6

Прерывание контроллера флоппи-диска по завершении операции.

F

IRQ7

Прерывание принтера. Генерируется принтером,

когда он готов к выполнению очередной операции.

Микросхема 8259 имеет три однобайтовых регистра, которые управляют 8 линиями аппаратных прерываний (рис. 42). Регистр запроса на прерывание IRR (Interrupt Request Register) устанавливает соответствующий бит, когда линия прерывания сигнализирует о запросе. Затем проверяется, не обрабатывается ли другое прерывание. Для этого контроллер запрашивает информацию от регистра обслуживания ISR (Interrupt Service Register). Регистр использует адреса портов 20h и A0h для первого и второго контроллера 8259 соответственно.

Перед вызовом прерывания проверяется регистр маски прерываний (Interrupt Mask Register, IMR), чтобы узнать, разрешено ли в данный момент прерывание данного уровня. Проверка связана с тем, что некоторые программы нежелательно прерывать, и они могут запретить аппаратные прерывания. Запрещение всех аппаратных прерываний необходимо при выполнении критических участков программного кода, а также при изменении вектора прерывания, чтобы избежать выполнения прерывания, когда вектор изменен только наполовину.

Рис. 42. Схема обработки аппаратного прерывания.

Регистр IMR определен за адресами 21h или A1h и предназначен только для записи. Если бит в этом порту установлен в 1, то прерывание с соответствующим номером будет запрещено. Для запрета определенных аппаратных прерываний следует установить биты регистра IMR, соответствующие номерам прерываний, выбранным для маскирования.

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

Регистр ISR позволяет получить содержимое регистров ISR и IRR. Код команды чтения регистра ISR равен 0Ah, регистра IRR – 0Bh. После выполнения команд содержимое регистров ISR и IRR доступно из портов 20h и A0h соответственно. Для получения содержимого регистра IMR необходимо выполнить чтение портов с адресами 21h или A1h.

11.5. Идентификация прерываний

Архитектура микропроцессоров семейства 8086 не позволяет однозначно идентифицировать источники некоторых прерываний по вектору. Например, прерывание по вектору 0 может произойти по одной из следующих причин:

  • по обнаружению ошибки во время выполнения инструкций деления DIV и IDIV;

  • по инструкции INT 0;

  • при поступлении сигнала внешнего маскируемого прерывания, сопровождаемого передачей нулевого номера вектора прерывания.

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

Если данному вектору прерывания не соответствует какая-либо линия запроса внешнего прерывания (IRQ), то и произойти это прерывание по внешнему запросу не могло. Рассмотрим способы анализа нескольких первых видов прерываний.

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

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

Прерывание по вектору 1. Чтобы определить, произошло ли прерывание по вектору 1 в результате трассировки выполнения программы с помощью флага TF или из-за выполнения инструкции INT 1, необходимо проверить состояние флага TF, сохранённом в стеке в процессе прерывания.

Если флаг сброшен, прерывание было вызвано инструкцией INT 1. Если флаг установлен, то имело место прерывание трассировки, что, однако, не исключает вероятности того, что одновременно была выполнена и инструкция INT 1. Однозначная идентификация в такой ситуации невозможна по той же причине, что и для вектора 0.

Прерывание по вектору 2. Прерывание может произойти либо при поступлении внешнего сигнала немаскируемого прерывания NMI, либо при выполнении двухбайтовой команды INT 2. Однозначная идентификация возможна только в случае, если аппаратура микропроцессорной системы обеспечивает программно-доступную фиксацию сведений о возникшем немаскируемом прерывании.

Прерывания по векторам 3 и 4. Прерывания могут быть программно однозначно идентифицированы: они происходят либо из-за выполнения однобайтовых инструкций INT 3 и INTO (коды CC и CE соответственно), либо из-за двухбайтовых инструкций INT 3 и INT 4 (коды CD 03 и CD 04 соответственно).

Таким образом, в связи с отсутствием однозначной идентификации при возникновении прерывания его обработчик должен определить конкретную причину возникновения прерывания. В общем случае невозможно точно идентифицировать источник прерывания по векторам 0–2.

11.6. Прерывания bios и ms-dos

Системное программное обеспечение аппаратных компонент ПК находится в ПЗУ, расположенной на системной плате и носит название BIOS (Basic Input-Output System, базовая система ввода-вывода).

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

Кроме того, BIOS управляет всеми прерываниями. Система BIOS строит таблицу прерываний (инициализирует векторы прерываний), выполняет прерывание INT 11h (получение списка присоединенного оборудования) и INT 12h (запрос размера физической памяти). Подпрограммы обработки прерываний находятся в модуле ПЗУ, в том же, что и процедура POST.

Среди прерываний BIOS для пользователя могут быть полезны функции прерывания 10h (вывод информации на дисплей), 13h (дисковые операции), 14h (обмен данными через последовательный порт), 16h (обмен данными с клавиатурой), 17h (функции вывода на печать), 1Ah (функции времени) и ряд других.

Прерывания в диапазоне от 20h до 27h закреплены за функциями операционной системы MS-DOS (табл. 93). Эти прерывания проще в использовании и менее машинно-зависимы, чем их BIOS аналоги. Например, многие функции прерывания INT 21h не имеют собственной реализации, а только транслируются в один или несколько вызовов функций BIOS. Дополнительную информацию по применению функций можно получить в [2,4,6].

Табл. 93. Прерывания операционной системы MS-DOS.

Номер

Описание прерывания

20

Завершение программы и передача

управления операционной системе.

21

Вызовы функций операционной системы MS-DOS.

Вызов функции в соответствии с кодом в регистре AH.

22

Адрес подпрограммы обработки завершения задачи.

23

Адрес выхода при обработке комбинации Ctrl-Break.

24

Адрес подпрограммы реакции на критическую ошибку.

25

Абсолютное чтение с диска.

26

Абсолютная запись на диск.

27

Завершение программы с сохранением ее в памяти

(резидентная программа).

28-3F

Зарезервированы для MS-DOS.

Источник: https://files.student-it.ru/previewfile/284711