Прерывания и особые ситуации: Типы и средства индикации исключений FPU

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Исключения FPU — это особые ситуации, которые возникают при выполнении команд сопроцессора. Существует шесть типов исключительных ситуаций FPU:

Каждому исключению соответствует флаг индикации в регистре состояния FPU (SW) и бит маски в регистре управления FPU (CW). Биты маски используются для разрешения/запрещения соответствующих исключений, а флаги для их индикации.

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

В современных процессорах (Intel286 …) предусмотрено два механизма сообщения процессору о возникновении исключения FPU.

Первый механизм использует специальную особую ситуацию #MF (Ошибка сопроцессора), которая генерируется автоматически при поступлении команды FPU/MMX/3DNow!, следующей за командой, вызвавшей ошибку. В процессорах Intel486 … это достигается внутренними средствами, а в Intel286, Intel386 при подаче сигнала от сопроцессора на соответствующий вход процессора (ERROR#).

Второй механизм работает в т.н. стиле MS-DOS. В этом случае ошибки сопроцессора обнаруживаются через внешнее прерывание, которое генерируется аппаратурой по сигналу от сопроцессора. Такой стиль поддерживается всеми процессорам архитектуры x86 для совместимости с программным и аппаратным обеспечением компьютеров PC XT, AT.

В процессорах с интегрированным FPU (Intel486 …) предусмотрен внутренний механизм выбора режима сообщения об ошибках FPU. Этот механизм управляется битом CR0.NE . Если NE установлен, действует внутренний механизм, обеспечивающий генерацию ошибки сопроцессора #MF сразу по поступлении очередной команды FPU/MMX/3DNow! вслед за командой, вызвавшей незамаскированное исключение (с помощью регистра управления сопроцессора CW  можно замаскировать все исключения).

Если NE сброшен, реакция на исключительния FPU происходит в стиле MS-DOS. В этом режиме задействуются специальные выводы FERR# и IGNNE# (вывод FERR# аналогичен выводу ERROR# сопроцессоров Intel287 и Intel387 и обычно подключается к внешнему программируемому контроллеру прерываний).

Протокол реакции на исключения FPU имеет некоторые отличия в различных моделях процессоров и сопроцессоров. Отличия эти касаются в первую очередь режима реакции в стиле MS-DOS и момента генерации ошибки сопроцессора (сразу по возникновении или при поступлении следующей команды FPU/MMX/3DNow!). В современных микропроцессорах наиболее универсальным и жестко регламентированным является режим внутренней генерации ошибки сопроцессора (CR0.NE = 1), который является основным, режим реакции в стиле MS-DOS поддерживается для совместимости. Подробное описание механизма реакции на исключения сопроцессора приведено в Intel® 64 and IA-32 Architectures Software Developer’s Manual. Volume 1: Basic Architecture.

Первопричиной генерации исключения сопроцессора могут быть только команды FPU. Команды MMX и 3DNow!, хотя и изменяют содержимое некоторых регистров, но не оказывают влияния на состояние FPU. Для индикации SIMD-исключений используется другой механизм, основанный на новых регистрах.