Программирование драйверов Windows

       

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


Редко, но все-таки случаются ситуации, когда необходимо использовать операции с плавающей точкой и, соответственно, задействовать сопроцессор (FPU). Особенность этой ситуации состоит в том, что в режиме ядра программный поток, намеревающийся использовать сопроцессор, обязан сохранить текущее состояние всех регистров сопроцессора (ST0-ST7, MMX0-MMX7, XMM0-XMM7). Для сохранения этой информации в наборе системных вызовов режима ядра предусмотрены функции KeSaveFloatingPointState

и KeRestoreFloatingPointState, первая из которых сохраняет состояние регистров сопроцессора в предоставляемом буфере, описываемом типом KFLOATING_SAVE, а вторая выполняет восстановление состояния сопроцессора по окончании работы с ним. Пример кода для работы с сопроцессором в режиме ядра приводится ниже:

double Xfloat; NTSTATUS status; KFLOATING_SAVE savedFPUData; status = KeSaveFloatingPointState(&savedFPUData);

if (NT_SUCCESS(status)) {// Работа с сопроцессором Xfloat = 0.; . . . . . . . . . . // Восстановление состояния сопроцессора из savedFPUData : KeRestoreFloatingPointState(&savedFPUData); }

Следует обратить внимание на то, что работа с сопроцессором выполняется только в случае, если удачно завершен вызов функции KeSaveFloatingPointState, которая должна вызываться на уровне IRQL не выше DISPATCH_LEVEL. Вызов функции KeRestoreFloatingPointState для восстановления состояния сопроцессора должен выполняться на том же уровне, что было выполнено сохранение.



Содержание раздела