использование double в kernel-mode

Тема в разделе "WASM.NT.KERNEL", создана пользователем kulinich, 13 фев 2012.

  1. kulinich

    kulinich New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2010
    Сообщения:
    3
    Есть необходимость активно использовать вещественные числа в драйвере.
    Здесь msdn.microsoft.com/en-us/library/windows/hardware/ff565388(v=vs.85).aspx пишут такой способ:
    Код (Text):
    1. KFLOATING_SAVE saveData;
    2. NTSTATUS status;
    3. double floatValue;
    4.  
    5. status = KeSaveFloatingPointState(&saveData);
    6.  
    7. if (NT_SUCCESS(status)) {
    8.  
    9.     floatValue = 1.0;
    10.     KeRestoreFloatingPointState(&saveData);
    11. }
    но я хотел бы поместить в DEVICE_EXTENSION переменные типа double, а потом уже в коде, при использовании этих переменных воспользоваться предложенным способом.
    1. Есть предложения, как это можно осуществить?
    2. Есть ли другие способы работы с double'ом в ядре

    P.S. Windows XP, WDM
    P.P.S я курсе, что вопрос, скорее всего, туп до невозможного... но все же решил задать его.
     
  2. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Да, там плохо объяснено почему именно нельзя использовать такие инструкции в ядре. В общем, смысл такой. В целях производительности при переключении контекста с пользовательского на ядерный сохраняются только общие регистры, а FPU, MMX и прочие не сохраняются. Отсюда вывод, что надо их самостоятельно сохранять.
     
  3. kulinich

    kulinich New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2010
    Сообщения:
    3
    Спасибо. Судя по всему, проще будет все вычисления с вещественными числами делать в user-mode'e, а в драйвер передавать уже приведенные значения (например, к USHORT'y).
    Не хотелось эти вычисления выводить в пользовательский режим, но видимо придется.
     
  4. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    а проблема-то собственно в чём?
     
  5. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Если много вычислений, можно создать поток ядра тогда не надо делать KeSaveFloatingPointState\KeRestoreFloatingPointState.

    Вообще задача не описана до конца, поэтому решения нормального быть не может.