К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 54
Текст из файла (страница 54)
Получается, что программа обработки прерывания очень похожа на обычную подпрограмму. Однако между ними имеются очень важные различия. Подпрограмма выполняет функцию, необходимую той программе, из которой она вызвана, тогда как программа обработки прерываний может не иметь ничего общего с выполняемой программой — эти две программы обычно даже принадлежат разным пользователям. Таким образом, перед вызовом программы обработки прерывания необходимо сохранить всю информацию, которая может быть изменена в ходе ее выполнения. Перед выходом из программы обработки прерывания эта информация должна быть восстановлена. После этого исходная программа может продолжить свое выполнение так, словно оно и не прерывалось (конечно, если не считать времени задержки).
К числу сохраняемой и восстанавливаемой информации обычно относятся значения флагов условий и содержимое всех тех регистров, которые используются и прерванной программой, и программой обработки прерывания. Задача сохранения и восстановления информации может автоматически выполняться процессором нли же командами программы. Большинство современных процессоров сохраняют только минимальное количество информации, необходимое для обеспечения целостности программ. Дело в том, что процесс сохранения и восстановления регистров включает обмен данными с памятью, увеличивающий время задержки между получением запроса прерывания и вызовом программы его обработки. Такого рода задержка называется задержкой обработки врериваиия.
Для некоторых приложений слишком большая задержка обработки прерываний неприемлема. Поэтому-то количество сохраняемой и восстанавливаемой процессором информации и должно быть сведено к минимуму. Как правило, процессор сохраняет только содержимое счетчика команд н регистра состояния процессора. Любая дополнительная информация должна сохраняться программным путем в начале работы программы обработки прерывания и восстанавливаться перед ее завершением. Некоторые ранние процессоры, и в первую очередь те, в которых было небольшое количество регистров, при получении запроса прерывания автоматически сохраняли содержимое всех своих регистров (без программного участия). Процедура восстановления регистров была включена в реализацию команды возврата из процедуры обработки прерывания. Некоторые процессоры поддерживают два типа прерываний: одни вызывают автоматическое сохранение регистров, а другие — нет.
Конкретное устройство ввода-вывода может использовать любой из типов прерываний в зависимости от необходимого времени ответа. Другой интересный подход 4.2. Прерывания 235 к решению этого вопроса заключается в использовании двух дублирующих друг друга наборов регистров процессора. Это позволяет программе обработки прерывания использовать второй набор регистров, поэтому сохранять и восстанавливать их не требуется. Прерывания — это нечто большее, нежели механизм координирования операций ввода-вывода. В общем случае прерывания обеспечивают передачу управления от одной программы к другой, инициируемую внешним по отношению к компьютеру событием.
После выполнения программы обработки прерывания работа прерванной программы возобновляется. Концепция прерываний применяется в операционных системах и во многих управляющих приложениях, когда выполнение определенных подпрограмм должно точно синхронизироваться с внешними событиями. Программы такого типа называются приложениями реального времени. 4.2.1.
Аппаратное обеспечение для поддержки прерываний Как уже было сказано, устройства ввода-вывода запрашивают прерывания путем активизации линии шины, называемой линией запроса прерывания. В большинстве компьютеров прерывания могут запрашиваться несколькими устройствами ввода-вывода. Но и в этом случае для обслуживания прерываний может использоваться одна линия (рис.
4.6). Каждое из устройств подсоединяется к этой линии с помощью ключа, соединенного с «землей», Для того чтобы запросить прерывание, устройство замыкает этот ключ. Таким образом, если ни один из сигналов запроса прерывания от 1ХТКг до 1ХТВ не активен, то есть если все ключи открыты, напряжение на линии запроса прерывания равно Узэ Это неактивное состояние линии. Когда устройство запрашивает прерывание, замыкая свой ключ, напряжение на линии падает до О, в результате чего процессор получает сигнал запроса прерывания 1ХТК, равный 1.
Поскольку замыкание одного или нескольких ключей приводит к падению напряжения на линии до О, значение 1ХТК является логической суммой (ИЛИ) запросов отдельных устройств: 1ХТК - 1ХТК + ... + 1ХТК Для обозначения сигнала запроса прерывания часто используют форму дополнения 1ХТК, поскольку сигнал активен, когда напряжение на линии равно О. В электронной реализации схемы, показанной на рис. 4.6, для управления ливией 1ХТК используются специальные вентили, называемые еенлиглями с открытым коллектором (для двухполюсных схем) или вентилями с открытым стоком (для схем МОП). Такие вентили эквивалентны ключу, соединяющему линию с «землей»о когда ключ открыт, значением на выходе вентиля является О, а когда закрыт — 1. Уровень напряжения, а также логическое состояние выхода вентиля в соответствии с приведенным выше равенством зависят от сигналов, поданных ва все соединенные с шиной вентили.
Резистор К называется ноеышаюигим резистором, поскольку при открытых ключах он позволяет поднять напряжение на линии до уровня, соответствующего состоянию высокого напряжения. 2Э6 Глава 4. Ввод-вывод Тйл Рис. 4.6. Архитектура шины с открытым стоком, используемая при реализации типичной линии запроса прерывания 4.2.2. Запрет и разрешение прерываний Компьютер должен предоставлять программисту полный контроль над событиями, происходящими во время выполнения программы.
В ответ на поступивший от внешнего устройства запрос на прерывание процессор приостанавливает выполнение одной программы и начинает выполнение другой. Поскольку запросы на прерывание могут поступать в любой момент, они наверняка изменят последовательность событий, установленную программистом. Поэтому выполнение программ обработки прерываний должно тщательно контролироваться. Одной нз основньтх возможностей, которой должен обладать любой компьютер, является возможность запрещать и разрешать прерывания по мере необходимости.
Давайте поговорим об этом более детально. Существует множество ситуаций, когда процессор должен игнорировать запросы прерываний. Например, в программе, выполняющей вычисления и печать (рис. 4.5), прерывания от принтера должны обрабатываться только в том случае, если имеются подготовленные к печати выходные строки. После печати и строк прерывания должны быть запрещены до тех пор, пока не будет готов следующий набор строк. В другой ситуации, возможно, понадобится дать гарантию того, что заданная последовательность команд будет выполнена до конца без прерываний, поскольку программа обработки прерываний может изменить используемые этими командами данные.
Следовательно, в распоряжении программиста должны быть средства как для разрешения прерываний, так и для их запрета. Проще всего для этих целей иметь специальные машинные команды. Рассмотрим простой пример обработки запроса на прерывание, поступающего от одного устройства. Когда устройство активизирует сигнал запроса прерывания, оно поддерживает этот сигнал активным до тех пор, пока не узнает, что процессор принял запрос. Это означает, что сигнал запроса прерывания будет активен еще какое-то время спустя после вызова программы обработки прерывания— до тех пор, пока не будет выполнена команда обращения к данному устройству. Важно, чтобы этот активный сигнал не привел к следующему прерыванию и таким образом не заставил систему войти в бесконечный цикл, из которого она не сможет выйти.
Существует несколько механизмов решения этой проблемы. Три 4.2. Прерывания 237 из них мы рассмотрим сейчас, а остальные, предусматривающие обработку прерываний от более чем одного устройства, будут описаны ниже. Первый механизм заключается в игнорировании схемой процессора сигнала на линии запроса прерывания до окончания выполнения первой команды в программе обработки прерывания. При этом первая команда программы обработки должна запретить прерывания до окончания действия данной программы.
Как правило, команда, разрешающая прерывания, является последней командой программы его обработки (она предшествует команде возврата иэ прерывания). При этом процессор должен гарантировать, что выполнение команды возврата из прерывания будет завершено до того, как станут возможными следующие прерывания. Второй механизм в большей мере подходит для простого процессора с единственной линией запроса прерывания. Он заключается в том, что процессор сам запрещает прерывания перед началом выполнения программы обработки прерываний и разрешает таковые по ее завершении.