Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 / Lectures / Lect3v12.doc
Скачиваний:
101
Добавлен:
28.05.2015
Размер:
706 Кб
Скачать
☆

19. Запоминание состояния, переход к прерывающей программе и возврат из нее

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

А. Определение допустимого момента прерывания

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

Известны следующие основные варианты определения допустимого момента прерывания:

- использование разрешающих флагов в командах;

- “жесткое” прерывание;

- прерывание по окончании выполнения текущей команды.

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

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

Прерывание по окончанию исполнения текущей команды программы является промежуточным вариантом, по отношению к первым двум, и используется в большей части ЭВМ в силу достаточно малых времени реакции и объема информации о состоянии. Тем не менее, известны ЭВМ, в которых для длинных по времени выполнения команд допускается прерывание после отдельных этапов выполнения таких команд.

Однако, при использовании этого способа должно учитываться также и то, какое действие вызвало необходимость прерывания. Если это происходит по причине того, что исполняемая команда пытается обратиться к не принадлежащей текущей программе (конечно, речь идет о прикладной программе) области памяти или выполнить какую-либо системную команду, запрещенную для прикладных программ, то ожидать окончания исполнения такой команды нельзя. В этом случае следует блокировать недопустимые действия команды, не дожидаясь ее завершения. Поэтому в типовых ЭВМ предусматривается три основных способа окончания выполнения команды:

- команда завершается, т.е., исполняется полностью;

- команда прекращается, т.е., ее исполнение останавливается на каком-либо шаге, предполагающем недопустимые действия;

- команда не выполняется, т.е., не выполняются никакие действия команды.

После приема запроса прерывания и окончания выполнения текущей команды начинается этап запоминания состояния прерываемой программы.

Б. Запоминание состояния прерываемой программы

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

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

Однако, помимо содержимого счетчика команд и регистра флагов, имеется и иная относящаяся к прерываемой программе информация, которая, в случае ее не сохранения может быть утрачена, что, в свою очередь, приведет к невозможности корректного возобновления выполнения этой программы. К такой информации относятся содержимое регистров процессора, установленное прерываемой программой, служебная информация, (маски, пороги), определяющая возможности прерывания данной программы, управляющая информация, задающая особенности текущего режимы работы ЭВМ, а также другая информация (например, в ПЭВМ, карта ввода-вывода).

Состояния прерываемой программы в момент прерывания сохраняется в памяти ЭВМ. Конкретное место (адреса) памяти, в котором сохраняется информация о состоянии, может определяться по-разному, причем, это может быть и не одна область памяти.

Поскольку количество запоминаемой информации может быть довольно большим, то время ее запоминания может заметно сказываться на производительности ЭВМ. Поэтому, во-первых, при прерывании стараются сохранить только необходимую в каждом конкретном случае информацию, в особенности, это касается содержимого общих регистров и других объемных частей информации о состоянии. А во-вторых, запоминание состояния организуют как аппаратными, так и программными средствами. Конечно, полностью аппаратный вариант более быстрый, но определение информации, запоминаемой в конкретном случае, может зависеть от вызываемой программы обработки прерывания. Поэтому, как правило, часть информации о состоянии запоминается аппаратно, а часть – программно.

Информацию о состоянии прерываемой программы, обычно группируют в специальные слова и/или блоки (сегменты), которые хранятся в соответствующих регистрах или участках памяти. Так, содержимое счетчика команд, регистра флагов и некоторых других управляющих регистров объединяют в, так называемое, слово состояния программы (или процессора). Эта информация, запоминается, как правило, аппаратно. (Впрочем, содержимое счетчика команд можно запомнить только таким образом.) Содержимое регистров процессора, обычно запоминается программно. Причем, поскольку обработчик прерываний может использовать не все регистры, а только некоторые из них, в начале своего исполнения он и обеспечит сохранение содержимого этих регистров. Однако, известны и системы, в которых каждой программе сопоставляется свой набор регистров общего назначения, что позволяет ускорить переключение между программами.

Место в памяти для аппаратно запоминаемой информации о состоянии может определяться различным способом, но для обеспечения возможности “вложенности” прерываний (новое прерывание может прервать обработку предыдущего) удобно использовать стек. Тем не менее, в ряде ЭВМ использовалось запоминание слова состояния по фиксированным адресам, а для обеспечения вложения прерываний обработчиками программно организовывался список (фактически, стек) обрабатываемых прерываний.

Программно запоминаемая информация о состоянии также может сохраняться либо в стеке (командами записи регистров в стек в начале тела обработчика прерывания), либо в специальных сегментах состояния прерываемой задачи.

По окончании запоминания состояния прерванной программы начинается обработка прерывания.

В. Переход к прерывающей программе и обработка запроса прерывания

Собственно переход к прерывающей программе заключается в передаче ей управления (загрузкой начального ее адреса в счетчик команд).

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

Основной задачей на этом этапе является определение того, где в (оперативной) памяти располагается программа обработки того вида запросов прерываний, к которому относится запрос, вызвавший обрабатываемое прерывание. Иногда в этой процедуре предусматривается и этап уточнения того, какое именно устройство выставило обрабатываемый запрос. Такой этап называют определением причины прерывания.

Определение причины прерывания зависит от особенностей организации системы. Для этой цели может использоваться как программные, так и аппаратные приемы.

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

Одни из возможных вариантов интерфейса, соответствующий этому случаю, показан на рис. 19.1.

Рис.19.1. Вариант подключения устройств- источников запросов прерываний при программном определении причины прерывания (ВнУi – внешнее устройство, Сх Сел – схема селекции адреса, Тг ЗПр – триггер запроса прерывания, ИУ – исполнительные узлы)

В этом случае все запросы прерываний поступают на один общий вход (шину) прерывания процессора. При обнаружении запроса (запросов) на этом входе после завершения текущей программы вызывается всегда одна и та же программа обработки прерываний.

В самом начале эта программа определяет, какое из внешних устройств выставило запрос прерывания, опрашивая их поочередно, начиная, например, с первого устройства. Для этого, на адресную шину процессора поочередно выставляются адреса (номера) устройств и подается сигнал по шине опроса. При этом в том устройстве, адреса которого выставлен на шине адреса, срабатывает селектор адреса (Сх Сел) и сигнал с его выхода совместно с сигналом опроса открывают соответствующий вентиль (схему “И”), через который состояние триггера запроса прерывания передается на шину данных процессора.

При обнаружении единицы на шине данных (выставленный запрос прерывания) программа обработки запросов передает управление на соответствующий участок программы или подпрограмму обработки найденного запроса. Эта подпрограмма сбросит выбранный запрос, сохранит программно запоминаемую информацию и приступит к выполнению действий, связанных с обработкой выбранного запроса. (Если, конечно, на шине больше нет запросов или прерывать принятый запрос нельзя.)

Если опрашиваемое устройство не выставляло запроса прерывания, то программа обработки обнаружит на шине данных “0” и перейдет к опросу следующего устройства.

Рассмотренный способ определения причины прерывания прост в реализации, но достаточно медленен, особенно, при большом количестве источников прерываний.

При аппаратном определении причины прерывания каждому входу, на который может поступать запрос прерывания, или однородной группе таких входов ставится в соответствие (жестко или перенастраиваемо) ячейка памяти или строка таблицы, в которых указаны начальные адреса программ-обработчиков соответствующих запросов прерываний. Причем, если программа вызывается для группы (класса) запросов, то она определяет конкретный источник прерывания, анализируя состояние входов группы.

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

После определения причины прерывания и передачи управления программе обработки запроса выполнялась собственно обработка запроса, по завершении которой требовалось вернуться к ранее прерванной программе.

В. Возврат к прерванной программе после завершения обработки запроса прерывания

Очевидно, что возврат к прерванной программе производится посредством восстановления ее состояния, существовавшего на момент прерывания, и передаче управления той ее команде, перед которой (или на которой, в зависимости от способа завершения последней команды в момент прерывания) она была прервана.

Процедура восстановления состояния обратна его запоминанию и производится теми же средствами: программно сохраняемая информация о состоянии восстанавливается программно, аппаратно сохраняемая – аппаратно. Поэтому последние команды обработчика прерываний (или вызываемая ими процедура) восстанавливают программно сохраненную информацию (чаще всего, содержимое регистров, которые использовались обработчиком). Естественно, место, в котором запоминалась программно сохраняемая информация обработчику известно, поскольку, в большинстве случаев, эта информация самим обработчиком и сохранялась.

Своей самой последней командой обработчик запускает восстановление аппаратно сохраненной информации и загрузку содержимого счетчика команд, существовавшего в момент прерывания. Обычно, это специальные команды, например IRET – возврат из прерывания, или LOAD PSW – загрузка слова состояния программы. По этим командам содержимое счетчика команд, регистра флагов (и другая аппаратно сохраняемая информация) извлекаются из того места, где они сохранялись, и рассылаются в соответствующие узлы.

Если эта информация сохранялась в стеке, то содержимое стека к моменту исполнения такой команды должно соответствовать тому, которое существовало в момент прерывания. В противном случае, возврат к прерванной программе нельзя будет выполнить корректно. (Неправильное содержимое стека – один из распространенных типов ошибок при сбоях операционной системы.)

Собственно установкой содержимого счетчика команд, осуществляется возврат к ранее прерванной программе и возобновляется ее выполнение.

Соседние файлы в папке Lectures