ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 20 Глава 19. Замечания о системном уровне ---------------------------------------------------------------- Системное программирование для процессора i486(TM) требует более детального понимания структуры модуля обработки операций с плавающей точкой, чем прикладное программирование. За работу таких функций, как инициализация, обработка исключений и синхронизация данных и ошибок, отвечает системный программист. Это и рассматривается подробно в настоящей главе. 19.1 Архитектура ---------------------------------------------------------------- На программном уровне модуль обработки операций с плавающей точкой является расширением модуля обработки целочисленных операций. Однако на уровне аппаратуры механизм взаимодействия между этими модулями более сложный. В настоящем разделе описано это взаимодействие и свойства, заинтересующие системного программиста. 19.1.1 Независимость способа адресации ---------------------------------------------------------------- В отличии от процессора 80287 NPX (но подобно 387(TM) NPX) модуль обработки операций с плавающей точкой процессора i486 работает независимо от того, работает процессор в режиме реальной адресации, в защищенном режиме или в виртуальном режиме процессора 8086. Числовые команды могут использовать любое место памяти, доступное задаче, выполняемой в настоящий момент. При работе в защищенном режиме все ссылки на операнды памяти автоматически проверяются системой управления памятью и механизмами защиты. При нарушениях механизма защиты, связанных с вычислительнымм операциями, процессор автоматически вызвает обработчик исключений. Для программирующего вычисления режим работы существенен только в том случае, если команды модулю обработки операций с плавающей точкой и ссылки на данные представлены в памяти с помощью команд FSAVE и FSTENV. Каждая из этих команд имеет один из четырех форматов в зависимости от режима работы и типа операнда в команде. Для более детальной информации о командах FSAVE и FSTENV смотрите главу 20. 19.2 Инициализация и управление процессором ---------------------------------------------------------------- Одни из наиболее важных функций системного программного обеспечения инициализация и управление аппаратными и программными ресурсами системы, включая модуль обработки операций с плавающей точкой. В этом разделе дано описание инициализации и управления, включая обработку исключений, которые могут случиться во время выполнения числовых команд. 19.2.1 Инициализация системы ---------------------------------------------------------------- Во время инициализации системы процессора i486 системные программы должны инициализировать модуль обработки операций с плавающей точкой и для отражения состояния среды вычислений установить флаги в регистр CR0. Эти действия могут быть выполнены быстро и легко, как часть общей инициализации системы. 19.2.2 Настройка конфигурации среды вычислений ---------------------------------------------------------------- Системная программа должна загрузить соответствующие значения в биты MP, EM и NE регистра управления CR0. Бит MP (Управление сопроцессором) определяет: прерывается ли выполнение задачи по команде WAIT, если содержимое модуля обработки операций с плавающей точкой отлично от выполняемой задачи. Если MP=1 и NS=1, то по умолчанию команда WAIT будет выдавать сообщение "Устройство Не Доступно" (вектор прерывания 7) Бит МР используется командой WAIT микропроцессоров 80286 и 386(TM) DX для ожидания доступа к устройству, отличному от числового сопроцессора. Устройство информирует о своем состоянии через контакт BUSY#. Так как процессор i486 не имеет такого контакта, бит МР не используется, и для нормальной работы ему необходимо присвоить 1. Бит ЕМ (Эмуляция сопроцессора) определяет выполняется ли команда ESC модулем обработки операций с плавающей точкой (ЕМ=0) или будет обрабатываться программой через вектор прерывания 7 (ЕМ=1). Бит ЕМ использовался в микропроцессоре 386 DX, чтобы вычислительные операции, написанные для системы 386 DX CPU/387DX, могли бы быть выполнены на программном эмуляторе сопроцессора 387 DX в отсуствии сопроцессора 387 DX. Для нормальной работы процессора i486 биту ЕМ должен быть присвоен 0. Бит NE (Численные исключения) показывает, как обрабатываются немаскированные исключения при работе с данными с плавающей точкой: через вектор прерывания 16 (NE=1) или через внешние прерывания (NE=0). В системах, использующих контроллер внешних прерываний для вызова обработчика числовых исключений, биту NE должен быть присвоен 0. Другие системы могут использовать автоматическую обработку ошибок через прерывание 16, и в бит NE тогда заносится 1. Для подробной информации об обработке численных исключений смотри раздел 19.2.5. 19.2.3 Инициализация модуля обработки операций с плавающей точкой ---------------------------------------------------------------- Инициализация модуля обработки операций с плавающей точкой означает приведение его в определенное состояние, независимо от предыдущих действий. Инициализация выполняется с помощью единственной команды FNINIT. В результате устанавливаются все маски ошибок, во все регистры заносится 0 и устанавливается режим управления округлением и точностью по умолчанию. В Таблице 19-1 показано состояние модуля операций с плавающей точкой после выполнения команды FINIT или FNINIT. Команда FNINIT приводит модуль обработки операций с плавающей точкой в такое же состояние, которое получается после нажатия клавиши RESET в результате выполнения встроенного теста по проверке памяти. Если встроенный тест не запрашивается, то нажатие RESET оставляет модуль обработки операций с плавающей точкой неизмененным. Команда FNINIT будет выполнена после перезагрузки. Таблица 19-1. Состояние FPU после инициализации ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї і Поле і Значение і Интерпретация і ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Слово Управления і 037FH і і і (Управление * і і і і бесконечностью) і 0 і і і Управление і і Округление до ближайшего і і округлением і 00 і і і Управление і і 64 бита і і точностью і 11 і і і Маски особых і і Все особые ситуации і і ситуаций і 111111 і заблокированы і ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Слово Состояния і 0000H і і і (Бит занятости) і 0 і і і Код Условия і 0000 і і і Вершина Стека і 000 і Регистр 0 - вершина стека і і Наличие Особой і і і і ситуации і 0 і Особых ситуаций нет і і Стековый флаг і 0 і і і Флаги Особых і і і і ситуаций і 000000 і Особых ситуаций нет і ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Слово Признака і FFFFH і і і Признаки і 11 і і ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Регистры і N.C. і Не изменялись і ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і Ссылки на Особые і і і і ситуации і і і і Код Команды і і і і Адрес Команды і і і і Адрес Операнда і і і АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ * Процессор i486 не имеет управления бесконечностью. Данная величина для программ, написанных для сопроцессора 80287; если эти программы зависят от этого бита, то для процессора i486 они могут работать неверно. 19.2.4 Эмуляция ---------------------------------------------------------------- При присвоении 1 биту ЕМ процессор i486 через вектор прерывания 7 (Устройство Не Доступно) будет вызывать программу обработки исключений, которая подсчитывает количество команд ЕSC. Бит EM используется для выполнения числовых операций на процессоре 386 с программным эмулятором сопроцессора 387. Числовые операции, предназначенные для выполнения на нестандартном эмуляторе сопроцессора 387, в отсуствии эмулятора могут не быть выполнены на процессоре i486 . Присвоение 1 биту ЕМ делает возможным выполнить эти операции или программы, использующие нестандартную арифметику с плавающей точкой, на процессоре i486. 19.2.5 Обработка числовых исключений ---------------------------------------------------------------- Как только модуль обработки операций с плавающей точкой был проинициализирован, и началось нормальное выполнение, модуль обработки операций с плавающей точкой может потребовать внимания, чтобы обработать числовые исключения. В этой главе рассматривается написание программных обработчиков числовых исключений. Если модуль обработки операций с плавающей точкой встречает немоскированное исключение, то сразу перед выполнением следующей команды WAIT или неуправляющей команды с плавающей точкой вызывается программный обработчик исключений. Вызов происходит через вектор прерывания 16 или через внешнее прерывание, в зависимости от значения бита NE регистра управления CR0. Если NE=1, то немаскированное исключение с плавающей точкой вызывает прерывание 16, непосредственно перед выполнением следующей неуправляющей команды с плавающей точкой или команды WAIT. Прерывание 16 есть сигнал операционной системе о необходимости вызова обработчика исключений. В главе 9 даны общие сведения об исключениях и прерываниях процессора i486. Если NE=0 (и ввод IGGNE# не активен), немаскированное исключение "замораживает" процессор сразу перед выполнением следующей неуправляющей команды с плавающей точкой или команды WAIT. "Замороженный" процессор ожидает внешнее прерывание, которое должно быть поддержано внешней аппаратурой в ответ на вывод процессора FERR#. (Независимо от значения NE немаскированное исключение заставляет вывод FERR# быть активным.) В этом случае внешнее прерывание вызывает программу обработки исключения. Усли NE=0, но ввод IGGNE# активен, то процессор не обращает внимание на исключение и продолжает работу. Обработка ошибок через внешние прерывания поддерживается для DOS, совместимых с процессором. В Главе 25 даны некоторые предложения по совместимости. При обработке ошибок вычислений процессор должен: - Не нарушить числовой контекст. - Сбросить ошибку и попытаться от нее избавиться. Хотя способы решения этих проблем меняются от реализации к реализации, большинство обработчиков должны выполнять следующие основные действия: - Сохранить среду модуля обработки операций с плавающей точкой (слова управления, статуса, признака, операнды и ссылки на команды), какой она была время генерации исключения. - Очистить бит исключения в слове состояния. - Замаскировать прерывания. - Распознать исключение, проанализировав слова управления и статуса в сохраненной среде. - Принять системно-зависимые меры по корректировке ситуации. - Вернуться к прерванной программе и возобновить нормальное выполнение. 19.2.6 Реакция на одновременные исключения ---------------------------------------------------------------- В случае, если несколько исключений возникает одновременно, модуль обработки операций с плавающей точкой сигнализирует об одном из них в соответствии с приоритетом, указанным в конце Главы 16. Это означает, например, что SNaN, деленное на 0, дает ошибочную операцию, а не исключение деления на нуль. 19.2.7 Примеры программ обработки исключений ---------------------------------------------------------------- Программы обработки исключений могут иметь различные формы. Они могут изменять правила программирования и арифметики процессора i486. Такие изменения могут переопределить ошибки, установленные по умолчанию, изменить видимость модуля обработки операций с плавающей точкой для программиста или изменить арифметику, определенную для модуля обработки операций с плавающей точкой. Чтобы изменить результат выдачи исключения, необходимо сначала выполнить ненормальную арифметику или ненормальную загрузку из памяти. Для изменения "видения" модуля обработки операций с плавающей точкой стековой регистр должен быть расширен до размеров памяти, чтобы предоставить для работы "бесконечное" число регистров. Арифметика модуля обработки операций с плавающей точкой может быть автоматически изменена через переопределение точности и диапазона значений при переполнении. Все эти функции процессора i486 могут быть реализованы через числовые прерывания и программы обработки в соответствии с нуждами программиста. Некоторые другие возможные программы в зависимости от применения могут включать: - Увеличение счетчика особых ситуаций при последней работе с дисплеем или при печати - Печать или выдача на экран диагностических сообщений (например, среда модуля обработки операций с плавающей точкой или регистров) - Прекращение дальнейшего выполнения - Сохранение величины диагностики (NaN) в результате и продолжение вычисления В зависимости от применения, исключения могут фиксировать, а могут и опускать ошибки. Как только обработчик исключения скорректирует условие, вызвавшее исключение, то при необходимости, команда с плавающей точкой, в которой случилось исключение, может быть выполнена еще раз. Это не может произойти при использовании команды IRET, так как прерывания случаются в команде ESC или в команде WAIT, вызываемой после команды ESC. Обработчик исключений должен получить (используя команду FSAVE или FSTENV) адрес нарушившей команды в программе, которая вызывала команду, сделать копию команды, выполнить ее в контексте нарушенной программы и затем через команду IRET вернуться к потоку текущих команд. Чтобы откорректировать условие, вызвавшее числовое исключение, обработчик исключений должен распознать состояние модуля обработки операций с плавающей точкой в то время, когда был вызван обработчик исключений. Для восстановления состояния модуля обработки операций с плавающей точкой программисты должны понимать когда, в течение выполнения числовой команды, нарушение было обнаружено. Недопустимые операции, деление на нуль, ненормализованные исключения обнаруживаются до начала выполнения операции, тогда как переполнение, отрицательное переполнение и исключения нарушения точности не возникают до тех пор, пока не будет вычислен результат. Если исключение обнаружено перед выполнением, то регистровый стек и память модуля обработки операций с плавающей точкой еще не были изменены, так как команда, содержащая нарушение, не выполнялась. При обнаружении исключения после начала выполнения команды регистровый стек и память выглядят так, будто команды была выполнена; например, они могут быть обновлены. (Однако в командах сохранить и сохранить-извлечь, немаскированное переполнение и отрицательное переполнение обрабатываются подобно исключению передя1 я0выполнением; память не обновлялась и из стек ничего не извлекалось.) Примеры в Главе 20 содержат несколько обработчиков исключений для обработки числовых исключительных ситуаций. |