Аппаратные и программные прерывания
№7 Аппаратные и программные прерывания Цель работы: Изучить систему вызова и обработки аппаратных и программных прерываний для IBM PC. Изучить команду INT МП 8086. Изучить функции DOS 25H и 35H и способы установки значения вектора прерывания.
Под прерыванием понимается программный и аппаратный сигнал микропроцессору, по которому выполнение текущей программы прекращается, сохраняется текущее состояние МП (регистр флагов, регистр CS и IP) и управление передается специальной подпрограмме, называемой подпрограммой (или процедурой) обработки прерывания или обработчиком прерывания. После завершения процедуры обработки прерывания выполнение прерванной программы продолжается. Прерывания бывают аппаратными (вырабатываются устройствами компьютера) и программными (возникают при выполнении специальной команды прерывания) Также прерывания могут возникать в ходе выполнения некоторых команд (например, деление на 0) – такие прерывания называются внутренними прерываниями (исключениями) процессора. В любом случае, после возникновения прерывания выполнение текущей программы прерывается, вызывается обработчик прерывания, и затем выполнение прерванной программы возобновляется. Аппаратные прерывания – это способ обратной связи устройств и процессора. Устройства используют прерывания как правило для того, чтобы сообщить процессору о готовности к передачи или приему данных, а также о какой либо исключительной ситуации. Аппаратные прерывания могут быть маскируемыми (прерывания от устройств, которые в определенных случаях могут быть проигнорированы микропроцессором) и немаскируемыми (представляют собой сигнал от устройств о какой-либо исключительной ситуации). Маскируемые прерывания можно запретить или разрешить специальными командами процессора. Они имеют более низкий приоритет по сравнению с немаскируемыми прерываниями. Немаскируемые прерывания не могут быть запрещены никакими командами процессора.
Программные прерывания представляют собой вызовы специальным образом оформленных процедур обработки прерываний. Обычно программные прерывания используются для вызова каких-либо сервисов операционной системы, драйверов устройств или BIOS. Внутренние прерывания процессора, как правило, генерируются при возникновении исключительных ситуаций при выполнении команд (переполнение при делении, неверный код операции, выход за границы сегмента и др. ). Также внутреннее прерывание может генерироваться при работе процессора в режиме отладки с установленным флагом TF, когда после выполнения каждой команды, кроме команды загрузки регистра SS, вызывается обработчик прерывания отладки. Обработчик прерывания – это специальным образом оформленная процедура, которая выполняет обработку того или иного типа прерывания и возвращает управление прерванной программе. Оформление процедур обработчиков прерываний для разных типов прерываний может быть различным. Обработка прерывания подразумевает выполнение каких-либо действий, отражающих реакцию программы на возникновение прерывания. Например, при возникновении аппаратного прерывания, символизирующего готовность устройства к передаче данных, обработчик прерывания может передать устройству команды для передачи им данных и сами данные. При возникновении прерывания всегда известен его номер – от 0 до 255. Для аппаратных прерываний этот номер передается процессору специальным устройством – контроллером прерываний. В случае программных прерываний номер прерывания указывается в команде программного прерывания. При возникновении внутренних прерываний процессора, он сам знает их номера. Требуется сопоставить каждому номеру прерывания адрес процедуры обработки прерывания. Этот адрес всегда является дальним, т. е. состоит из сегмента и смещения и называется вектором прерывания. Таким образом, процессор при возникновении прерывания по его номеру определяет вектор прерывания и передает по нему управление.
Для хранения векторов прерываний используется специальная таблица - таблица векторов прерываний, которая содержит 256 ячеек, каждая ячейка содержит вектор прерывания (сегмент и смещение). Размер таблицы – 1024 байта, так как всего имеется 256 векторов прерываний, а каждый из них имеет размер 4 байта (2 байта – сегмент и 2 байта – смещение). Таблица векторов прерываний всегда располагается по абсолютному физическому адресу 0h в памяти компьютера. При возникновении прерывания процессор по номеру прерывания вычисляет смещение от начала таблицы векторов прерываний по формуле: смещение = номер_прерывания * 4. После того, как смещение вычислено, процессор обращается к требуемой ячейке таблицы векторов прерываний, берет из нее вектор прерывания и передает по нему управление обработчику прерывания. Программные прерывания – это специальные вызовы сервисов операционной системы, драйверов устройств и BIOS. Программное прерывание вызывается специальной командой INT. Команда INT имеет только один операнд – номер прерывания, который указывается в команде в виде числа от 0 до 255. При выполнении команды INT процессор выполняет следующие действия: 1. записывает в стек значение регистра флагов; 2. записывает в стек значение регистра CS; 3. записывает в стек смещение команды, следующей за командой INT; 4. вычисляет смещение от начала таблицы векторов прерываний по формуле смещение = номер_прерывания * 4; 5. извлекает из таблицы векторов прерываний вектор прерывания по вычисленному смещению; 6. заносит в регистр IP значение смещения из вектора прерывания; 7. заносит в регистр CS значение сегмента из вектора прерывания; 8. сбрасывает флаг прерывания IF и флаг трассировки TF; 9. передает управление процедуре обработки прерывания.
С этого момента выполняется процедура обработки прерывания. По завершении процедуры должна вызываться специальная команда возврата из процедуры обработки прерывания IRET. Команда IRET выполняет следующие действия: 1. извлекает из стека сохраненное в нем значение смещения команды, следующей за командой INT, и записывает его в регистр IP; 2. извлекает из стека сохраненное в нем значение регистра CS и записывает его в регистр CS; 3. извлекает из стека сохраненное в нем значение регистра флагов и записывает его в регистр флагов; 4. передает управление прерванной программе по адресу CS: IP. После этого выполнение прерванной программы возобновляется. Внутренние исключения процессора обрабатываются по такой же схеме. Цикл обработки аппаратного прерывания гораздо сложнее. Рассмотрим обработку маскируемых аппаратных прерываний. Все устройства, которые генерируют маскируемые прерывания, подключаются к контроллеру прерываний. Контроллер прерываний при поступлении сигнала прерывания от устройства выполняет следующие действия: 1. если одновременно поступило несколько сигналов прерываний, то контроллер выбирает то устройство, чей приоритет выше; 2. контроллер проверяет, замаскировано ли данное прерывание, т. е. запрещено ли прохождение этого сигнала прерывания. Если запрещено, то на этом процесс обработки прерывания завершается; 3. выдает МП сигнал запроса на обработку прерывания. Если в регистре флагов установлен флаг IF, то это означает, что маскируемые прерывания разрешены и МП отвечает контроллеру сигналом разрешения обработки прерывания. В ответ на это контроллер прерываний посылает МП номер вектора прерывания. Далее выполняются такие же действия, как и для программных прерываний: МП берет из таблицы векторов прерывания нужный вектор, который он определяет по номеру прерывания, переданного контроллером прерываний, и передает управление по этому вектору на процедуру обработки прерываний. Маскируемые прерывания можно запретить сбросом флага IF командой CLI. В этом случае МП игнорирует запросы от контроллера прерываний. Запретить маскируемое прерывание от конкретного устройства можно путем записи в контроллер прерываний специальной команды. При этом сигнал прерывания от данного устройства не будет обрабатываться контроллером прерывания. Сигналы прерываний от других устройств обрабатываться будут. Сброс флага IF микропроцессором при входе в обработчик прерывания необходим для исключения возможности появления вложенных прерываний – т. е. когда во время выполнения обработчика прерывания возникает еще одно аппаратное прерывание.
После того, как МП ответит контроллеру прерываний на его запрос, контроллер прерываний помечает пришедшее к нему прерывание как обрабатываемое и если во время обработки прерывания контроллеру поступит сигнал прерывания от устройства с более низким или с таким же приоритетом, он его проигнорирует. Чтобы дать контроллеру прерываний знать об окончании обработки прерывания, требуется в конце процедуры обработки аппаратного прерывания разблокировать контроллер, послав ему сигал конца прерывания EOI (End Of Interrupt). Это выполняется путем записи в порт ввода-вывода с номером 20h значения 20h.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|