Немаскируемая обработка исключений

Как производить немаскируемую обработку исключений?Для этого необходимо

установить в ноль те флаги в регистре CWR,которые соответствуют интересующим

нас типам исключений.Далее нужно написать обработчик исключения,реализу-

ющий последовательность действий по корректировке ситуации,приведшей к ис-

ключению.Неясным остается вопрос о том,как передать управление обработчику

исключения?Для ответа на него нужно разобраться с проблемой взаимодействия

процессора и сопроцессора при возникновении исключения.

В главе 2 мы упоминали о существовании группы системных регистров про-

цессора.В контексте нашего рассмотрения интерес представляет один из них —

регистр CRO.Он имеет несколько битов,имеющих отношение к сопроцессору

(табл.17.3).

Таблица 17.3. Биты CRO,имеющие отношение к сопроцессору

Положение

бита в CRO

Название

бита

МР (Math

Present)

Назначение

Сопроцессор присутствует.Бит должен быть

установлен в 1Положение

бита в CRO

Название

бита

ЕМ (Emulation

Math)

TS (Ta ^k

Switched)

ET (Extension

Type)

NE (Numeric

Error)

Назначение

Эмуляция сопроцессора.Когда ЕМ =1,выполнение

любой команды сопроцессора вызывает исключение 7.

В программах для микропроцессосоров 18086...1386

это позволяло иметь альтернативные фрагменты кода

для выполнения одинаковых вычислений

с использованием команд сопроцессора (ЕМ =0)

и без них (ЕМ =1),то есть тогда,когда в конкретной

конфигурации компьютера сопроцессор отсутствует

Задача переключена.Бит предназначен для

согласования контекстов основного процессора

и сопроцессора.Бит TS устанавливается в единицу

при каждом переключении задачи.Состояние этого

бита проверяется процессором,если очередной

выбранной командой является команда сопроцессора.

Если бит TS установлен в единицу,то процессор

возбуждает исключение 7,обработчик которого

выполняет необходимые действия,возможно,

по сохранению или восстановлению контекста

вычислений с плавающей точкой.С битом TS

работает команда CLTS,которая устанавливает

значение этого бита в 0

Тип расширения.Единичное значение этого бита

означает поддержку инструкций сопроцессора

Численная ошибка.Бит определяет способ обработки

исключений сопроцессора:через сигнал внешнего

прерывания или путем генерации исключения

(см.далее)

Начиная с модели i486 процессор и сопроцессор размещаются в одном корпу-

се.Это упростило организацию взаимодействия между ними.Рассмотрим процес-

сы,протекающие в к эмпьютере при возникновении одного из шести перечислен-

ных ранее исключений сопроцессора.При возникновении ситуации исключения

сопроцессор устанавливает бит суммарной ошибки ES в регистре состояния SWR

и формирует на однс м из своих выходов сигнал ошибки.Этот сигнал ошибки од-

новременно воспринимается самим процессором,который генерирует исключе-

ние 10h,и в то же самое время,независимо от процессора,заводится на вход IRQ13

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

через вектор прерывания 75h [8 ].Таким образом,появление сигнала ошибки на

выходе сопроцессора приводит к генерации в основном процессоре двух исключе-

ний с номерами 10h я 75h.

Исключение 10п!является синхронным,так как вызов его обработчика санк-

ционируется процессором при выполнении команд WAIT/FWAIT.Данные команды

в процессорах i486 и Pentium встроены практически во все команды сопроцессора

за исключением некоторых команд управления,поэтому работа любой команды

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

ной ситуации после выполнения команды,вызвавшей исключение,оказывается

полностью сформированным (так как исключение синхронное,то есть ожидаемое)

и с ним можно корректно работать.

Если сигнал поступает на вход программируемого контроллера прерываний

IRQ13,то обработка исключения 75h может начаться в процессоре раньше,чем

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

в этом случае обработка прерывания является асинхронной к вычислительному

процессу.

Необходимо отметить влияние бита NE на процессы,протекающие в компьюте-

ре при возникновении исключения.Его состояние определяет стиль обработки

исключения процессором.Если бит NE =1,то процессор возбуждает исключение

16 (обработка в стиле 1286 и выше),если NE =0,то при возникновении исключения

процессор останавливается и ждет прерывания от программируемого контролле-

ра прерываний (обработка в стиле 18086).По умолчанию бит NE устанавливается в 0.

Если посмотреть на распределение прерываний в реальном и защищенном ре-

жимах,то необходимо обратить внимание на номер 7 вектора прерываний — обра-

щение к несуществующему сопроцессору.Прерывание появилось в процессоре 1286,

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

программа,выполняющая математические вычисления,была независимой от ап-

паратной конфигурации конкретного компьютера,писалось два варианта фраг-

ментов кода,на которых эти вычисления выполнялись,— один с использованием

команд сопроцессора и второй с использованием целочисленных команд.При рас-

познавании в потоке команд инструкций сопроцессора процессоры 1286 и 1386 про-

веряли бит эмуляции сопроцессора ЕМ (см.табл.17.3).Если он был равен 1,то

процессор возбуждал исключение 7.Это означало,что сопроцессора в конфигура-

ции компьютера нет и его функции должны эмулироваться командами целочис-

ленного устройства.Забота об установке бита ЕМ ложилась на системное программ-

ное обеспечение.

Для процессоров i486 и Pentium состояние вычислительной среды определяет-

ся состоянием регистров после выполнения команды FINIT и содержимым регист-

ра CRO (биты МР и NE).

Что должен делать обработчик исключений сопроцессора?Его действия зави-

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

отметить основные действия по обработке любого исключения.

1.Сохранение среды сопроцессора командой FSTENV.Это необходимо для после-

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

фиксировано состояние регистров управления сопроцессором при возникно-

вении исключения.

2.Сброс установленных битов исключений в регистре SWR для предотвращения

циклического возникновения исключений.

3.Выяснение типа исключения.Если незамаскированными являются исключе-

ния нескольких типов,то обработчик путем анализа соответствующих битов

в регистре SWR должен определить их.Заметим,что содержимое SWR берется из

сохраненной при входе в процедуру по команде FSTENV среды сопроцессора.

Выполнение действий по корректировке ситуации.

5.Возвращение в прерванную программу (командой IRET).

Однако выяснить причину исключения мало,да это и несложно.Важно,испра-

вив ситуацию,вернуть управление прерванной программе.В защищенном режи-

ме работы процессора прерывания (исключения)делятся на несколько групп:сбои,

ловушки,исключения.Это деление осуществляется в зависимости от того,какая

информация сохраняв тся о месте возникновения прерывания (исключения)и воз-

можности возобновления прерванной программы.Для сопроцессора ситуация ана-

логична.Здесь инфор мация о месте возникновения исключения зависит от типа

исключения.Так,для исключений недействительной операции,деления на ноль

и денормализованног(э операнда запоминается адрес команды,вызвавшей исклю-

чение.То есть ситуация для этих типов исключений распознается,и исключение

возбуждается до исполнения команды сопроцессора (по классификации для за-

щищенного режима -• это сбой).При этом операнды в стеке ив памяти не моди-

фицируются.Для остальных типов исключений ошибочная ситуация распознает-

ся после выполнения действий «виноватой» команды.Это означает,что в стеке

в качестве адреса места возникновения исключения запоминается адрес следую-

щей (после виновниц ы)команды программы.При этом операнды в памяти и в ре-

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

эти особенности возникновения различных типов исключений.

i

!


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: