
- •7. Ввод-вывод
- •7.1. Доступ к устройствам ввода-вывода
- •7.2. Прерывания
- •7.2.1. Аппаратное обеспечение для поддержки прерываний
- •7.2.2. Запрет и разрешение прерываний
- •7.2.3. Обслуживание нескольких устройств
- •7.2.4. Управление запросами устройств
- •7.2.5. Исключения
- •7.2.6. Прерывания в операционных системах
- •7.3. Механизм прерываний процессора Pentium
- •7.4. Прямой доступ к памяти
7.2.1. Аппаратное обеспечение для поддержки прерываний
Как уже было сказано, устройства ввода-вывода запрашивают прерывания путем активизации линии шины, называемой линией запроса прерывания. В большинстве компьютеров прерывания могут запрашиваться несколькими устройствами ввода-вывода. Но и в этом случае для обслуживания прерываний может использоваться одна линия (рис. 7.6). Каждое из устройств подсоединяется к этой линии с помощью ключа, соединенного с «землей». Для того чтобы запросить прерывание, устройство замыкает этот ключ. Таким образом, если ни один из сигналов запроса прерывания от intr1 до INTRn не активен, то есть если все ключи открыты, напряжение на линии запроса прерывания равно Vdd. Это неактивное состояние линии. Когда устройство запрашивает прерывание, замыкая свой ключ, напряжение на линии падает до 0, в результате чего процессор получает сигнал запроса прерывания INTR, равный 1. Поскольку замыкание одного или нескольких ключей приводит к падению напряжения на линии до 0, значение INTR является логической суммой (ИЛИ) запросов отдельных устройств:
INTR = INTR1 + ... + INTRn
Для обозначения
сигнала запроса прерывания часто
используют форму дополнения
,
поскольку сигнал активен, когда напряжение
на линии равно 0.
В электронной
реализации схемы, показанной на рис.
7.6, для управления линией
используются специальные вентили,
называемыевентилями
с открытым коллектором
(для двухполюсных схем) или вентилями
с открытым
стоком (для
схем МОП). Такие вентили эквивалентны
ключу, соединяющему линию с «землей»:
когда ключ открыт, значением на выходе
вентиля является 0, а когда закрыт — 1.
Уровень напряжения, а также логическое
состояние выхода вентиля в соответствии
с приведенным выше равенством зависят
от сигналов, поданных на все соединенные
с шиной вентили. Резистор R называется
повышающим
резистором,
поскольку при открытых ключах он
позволяет поднять напряжение на линии
до уровня, соответствующего состоянию
высокого напряжения.
Рис. 7.6. Архитектура шины с открытым стоком, используемая при реализации типичной линии запроса прерывания
7.2.2. Запрет и разрешение прерываний
Компьютер должен предоставлять программисту полный контроль над событиями, происходящими во время выполнения программы. В ответ на поступивший от внешнего устройства запрос на прерывание процессор приостанавливает выполнение одной программы и начинает выполнение другой. Поскольку запросы на прерывание могут поступать в любой момент, они наверняка изменят последовательность событий, установленную программистом. Поэтому выполнение программ обработки прерываний должно тщательно контролироваться. Одной из основных возможностей, которой должен обладать любой компьютер, является возможность запрещать и разрешать прерывания по мере необходимости. Давайте поговорим об этом более детально.
Существует множество ситуаций, когда процессор должен игнорировать запросы прерываний. Например, в программе, выполняющей вычисления и печать (рис. 7.5), прерывания от принтера должны обрабатываться только в том случае, если имеются подготовленные к печати выходные строки. После печати n строк прерывания должны быть запрещены до тех пор, пока не будет готов следующий набор строк. В другой ситуации, возможно, понадобится дать гарантию того, что заданная последовательность команд будет выполнена до конца без прерываний, поскольку программа обработки прерываний может изменить используемые этими командами данные. Следовательно, в распоряжении программиста должны быть средства как для разрешения прерываний, так и для их запрета. Проще всего для этих целей иметь специальные машинные команды.
Рассмотрим простой пример обработки запроса на прерывание, поступающего от одного устройства. Когда устройство активизирует сигнал запроса прерывания, оно поддерживает этот сигнал активным до тех пор, пока не узнает, что процессор принял запрос. Это означает, что сигнал запроса прерывания будет активен еще какое-то время спустя после вызова программы обработки прерывания — до тех пор, пока не будет выполнена команда обращения к данному устройству. Важно, чтобы этот активный сигнал не привел к следующему прерыванию и таким образом не заставил систему войти в бесконечный цикл, из которого она не сможет выйти. Существует несколько механизмов решения этой проблемы.
Три из них мы рассмотрим сейчас, а остальные, предусматривающие обработку прерываний от более чем одного устройства, будут описаны ниже.
Первый механизм заключается в игнорировании схемой процессора сигнала на линии запроса прерывания до окончания выполнения первой команды в программе обработки прерывания. При этом первая команда программы обработки должна запретить прерывания до окончания действия данной программы. Как правило, команда, разрешающая прерывания, является последней командой программы его обработки (она предшествует команде возврата из прерывания). При этом процессор должен гарантировать, что выполнение команды возврата из прерывания будет завершено до того, как станут возможными следующие прерывания.
Второй механизм в большей мере подходит для простого процессора с единственной линией запроса прерывания. Он заключается в том, что процессор сам запрещает прерывания перед началом выполнения программы обработки прерываний и разрешает таковые по ее завершении. После сохранения в стеке регистра PC и регистра состояния процессора FX процессор выполняет действия, эквивалентные команде запрета прерываний. Очень часто для запрета и разрешения прерываний используется один разряд в регистре FX, называемый флагом разрешения прерываний (interrupt-enable). Если прерывания разрешены, этот разряд содержит 1, а если запрещены — 0. После сохранения в стеке регистра FX, в котором разряд разрешения прерываний установлен в 1, процессор очищает этот разряд в своем регистре FX, запрещая тем самым дальнейшие прерывания. При выполнении команды возврата из прерывания содержимое регистра FX восстанавливается из стека и флаг разрешения прерываний снова становится равным 1. Это значит, что прерывания разрешены.
Третий механизм предполагает, что у процессора имеется специальная линия запроса прерываний и что схема управления прерываниями отвечает только на передний фронт сигнала. Эта линия называется управляемой фронтом сигнала. При такой схеме работы процессор получает только один запрос прерывания, независимо от того, как долго линия остается активной. Это значит, что повторяющихся прерываний быть не может и нет необходимости явно отключать запросы прерывания на данной линии.
Прежде чем мы перейдем к более сложным аспектам прерываний, давайте еще раз коротко определим последовательность событий, происходящих в ходе обработки запроса прерывания от одного устройства. Если предположить, что изначально прерывания разрешены, эта последовательность будет следующей.
1. Устройство генерирует запрос прерывания.
2. Процессор прерывает текущую выполняемую программу.
3. Последующие прерывания запрещаются, для чего изменяются управляющие биты в регистре FX (за исключением схем, в которых линия запроса прерывания управляется фронтом сигнала).
4. Устройство информируется о том, что его запрос распознан, и в ответ сбрасывает сигнал запроса на прерывание.
5. Запрошенное прерыванием действие выполняется программой обработки прерывания.
6. Прерывания разрешаются, выполнение программы возобновляется.