kulinich
@kulinich
С++ программист

Double в kernel-mode (WinXp)?

Есть необходимость активно использовать вещественные числа в драйвере.

Здесь msdn.microsoft.com/en-us/library/windows/hardware/...(v=vs.85).aspx пишут такой способ:

KFLOATING_SAVE saveData;
NTSTATUS status;
double floatValue;

status = KeSaveFloatingPointState(&saveData);

if (NT_SUCCESS(status)) {

    floatValue = 1.0;
    KeRestoreFloatingPointState(&saveData);
}



но я хотел бы поместить в DEVICE_EXTENSION переменные типа double, а потом уже в коде, при использовании этих переменных воспользоваться предложенным способом.

1. Есть предложения, как это можно осуществить?

2. Есть ли другие способы работы с double'ом в ядре


P.S. Windows XP, WDM
  • Вопрос задан
  • 2526 просмотров
Решения вопроса 1
@amirul
Налицо недопонимание :-), попробую прояснить ситуацию
В общем, каждый поток имеет свой «контекст» (хранится в _KTHREAD::StateSaveArea), который включает в себя в том числе и состояние FPU (а также MMX, SSE и прочих) регистров. От этого никуда не денешься и при переключении контекста все это состояние сохраняется и перезагружается новыми значениями.

Но учитывая то, что
1. Все эти векторные расширения/плавающие точки имеют довольно много довольно больших регистров
2. Для подавляющего большинства «ядерного» кода они все равно не нужны
3. Переключение из юзермода в ядро и обратно должно быть как можно более быстрым

то было принято решение, что ядерщики не облезут закатывать солнце вручную. Другими словами, при переключении в режим ядра и обратно перезагружаются только целочисленные регистры общего назначения (ну и флаги, сегментные регистры и пр.). Чтоб не нагадить в результаты вычислений пользовательской части потока, которая имела неосторожность вызвать (прямо или косвенно) Ваш код, нужно перед модификацией FP контекста сохранить его, а перед возвратом в юзермод — восстановить. Хранить результаты можно где угодно (в том числе и в девайс экстеншне).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AterCattus
@AterCattus
Люблю быстрый backend
В силу специфики темы, я бы рекомендовал с таким вопросом обратиться на wasm.ru.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы