Поведение процессора при выполнении команды в зависимости от режима, в котором он находится, страница 5

¦         ¦cpTRAPcc, деление на¦                              ¦

¦         ¦нуль, RTE, RTM,     ¦                              ¦

¦         ¦TRAP #n, TRAPV      ¦                              ¦

+---------+--------------------+------------------------------+

¦  3      ¦3.0 - запрещенная   ¦ обработка исключения начина- ¦

¦         ¦команда, A-код,     ¦ ется до выполнения команды   ¦

¦         ¦незадействованный   ¦                              ¦

¦         ¦F-код, нарушение    ¦                              ¦

¦         ¦привилегированности,¦                              ¦

¦         ¦предкомандное       ¦                              ¦

¦         ¦исключение cp       ¦                              ¦

+---------+--------------------+------------------------------+

¦  4      ¦4.0 - посткомандное ¦ обработка исключения начина- ¦

¦         ¦исключение cp       ¦ ется по завершении выполнения¦

¦         ¦4.1 - трассировка   ¦ текущей команды или обработки¦

¦         ¦4.2 - прерывание    ¦ предыдущего исключения       ¦

L---------+--------------------+------------------------------0.0 -  высший приоритет, 4.2 - низший приоритет

cp = сопроцессор

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

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

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

6.3 ДЕТАЛЬНОЕ ОПИСАНИЕ ОБРАБОТКИ ИСКЛЮЧЕНИЙ

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

6.3.1 Сброс

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

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

Команда сброса RESET не воздействует на  какие-либо  внутренние регистры; она устанавливает сигнал на  линии  RESET,  инициируя сброс всех внешних устройств. Иными словами, она  дает  возможность программным способом привести систему в известное состояние, а затем продолжить выполнение программы со  следующей  команды.

6.3.2 Ошибка адреса

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

6.3.3 Ошибка шины

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

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