Немаскируемая обработка исключений
Как производить немаскируемую обработку исключений?Для этого необходимо
установить в ноль те флаги в регистре 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
!
Дата добавления: 2015-04-15; просмотров: 1049;