И ЕЩЕ О ПРЕРЫВАНИЯХ

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

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

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

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

Отметим одно отличие обработки прерывания от вызова подпрограммы. При обращении к подпрограмме необходимо так или иначе указать адрес ячейки памяти, в которой находится первая из команд подпрограммы. В ЭВМ с векторной системой прерываний совершенно необязательно знать, в каком месте памяти находится обработчик прерывания. Для обращения к подпрограмме обработки прерывания достаточно знать только номер элемента вектора прерываний, который содержит адрес обработчика. При этом действия, которые может выполнять подпрограмма обслуживания прерывания, ограничиваются только программными возможностями процессора. Эти свойства позволяют использовать механизм прерываний с еще одной целью. В системе команд многих ЭВМ имеются команды, которые позволяют программно запускать механизм прерываний (команда INT процессора 8086, команды TRAP и EMT процессора PDP - 11, команда SVC в машинах IBM 360). Прерывания, генерируемые командами программы, носят название программных прерываний. По существу, программные прерывания являются просто изощренным способом обращения к подпрограммам. В отличие от “обычных” подпрограмм, программные прерывания позволяют не указывать в команде адрес подпрограммы, а используют аппаратный механизм прерываний. Чаще всего программные прерывания используются в программах для обращения к операционной системе. Помимо более короткой записи (не нужно указывать адрес подпрограммы) использование программных прерываний дает возможность обратиться к подпрограмме, не зная адреса, по которому подпрограмма операционной системы расположена в памяти.

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

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