Что означает код BSOD 231 (INVALID_FLOATING_POINT_STATE)?

 
Также может означать:
КонстантаТипОС
ERROR_PIPE_BUSYОшибка WindowsWindows
Предыдущий Следующий
DRIVER_VERIFIER_DMA_VIOLATION INVALID_CANCEL_OF_FILE_OPEN

INVALID_FLOATING_POINT_STATE

Проверка ошибок INVALID_FLOATING_POINT_STATE имеет значение 0x000000E7. Это означает, что сохранённое состояние операций с плавающей точкой для потока недопустимо.

Важно

Эта статья предназначена для программистов. Если при работе с компьютером появился синий экран с кодом INVALID_FLOATING_POINT_STATE, см. Устранение ошибок синего экрана.

Параметры INVALID_FLOATING_POINT_STATE

Параметр 1 указывает, какая проверка допустимости завершилась ошибкой. Параметр 4 не используется. Для INVALID_FLOATING_POINT_STATE смысл остальных параметров зависит от значения параметра 1.

Параметр 1 Параметр 2 Параметр 3 Причина ошибки

0x0

Поле флагов

0

Поле флагов сохранённого контекста недопустимо. Либо флаг FLOAT_SAVE_VALID не установлен, либо некоторые зарезервированные биты ненулевые.

0x1

Сохранённый IRQL

Текущий IRQL

Текущий IRQL процессора отличается от уровня, на котором был сохранён контекст операций с плавающей точкой.

0x2

Сохранённый адрес потока, которому принадлежит этот контекст операций с плавающей точкой

Текущий поток

Сохранённый контекст не принадлежит текущему потоку.

Причина

При восстановлении ранее сохранённого состояния операций с плавающей точкой для потока обнаружено, что оно недопустимо.

Параметр 1 указывает, какая проверка допустимости завершилась ошибкой.

Состояние операций с плавающей точкой

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

В архитектурах компьютеров общего назначения один или несколько FPU могут быть встроены как исполнительные блоки центрального процессора; однако многие встраиваемые процессоры не имеют аппаратной поддержки операций с плавающей точкой (хотя такая поддержка всё чаще входит в стандартную комплектацию, по крайней мере в 32-разрядных моделях).

Когда CPU выполняет программу, запрашивающую операцию с плавающей точкой, существует три способа её выполнить:

  • Эмулятор блока операций с плавающей точкой (библиотека операций с плавающей точкой).
  • Дополнительный FPU.
  • Встроенный FPU.

Функция KeSaveFloatingPointState

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

NTSTATUS KeSaveFloatingPointState( [out] PKFLOATING_SAVE FloatSave );

Успешный вызов KeSaveFloatingPointState позволяет вызывающему коду выполнять собственные операции с плавающей точкой, однако после их завершения он должен как можно скорее восстановить предыдущий неизменяемый контекст операций с плавающей точкой. Любая процедура, вызывающая KeSaveFloatingPointState, должна вызвать KeRestoreFloatingPointState до возврата управления.

При успешном вызове KeSaveFloatingPointState данные по адресу FloatSave непрозрачны для вызывающего кода. Вызывающий код не должен освобождать выделенную для этих данных память до вызова KeRestoreFloatingPointState.

В Windows Vista и более ранних версиях Windows вызов KeSaveFloatingPointState и соответствующий вызов KeRestoreFloatingPointState должны выполняться в защищённой области. То есть перед вызовом KeSaveFloatingPointState необходимо вызвать KeEnterGuardedRegion, а после вызова KeRestoreFloatingPointState необходимо вызвать KeLeaveGuardedRegion . В Windows 7 и более поздних версиях Windows это требование отсутствует.

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


Нужно найти другой код? Найти другой код состояния или ошибки.