Re: Floating Point в драйвере

From
Alex Fedotov (2:5020/175.2)
To
Vladislav Volovik ()
Date
2001-09-16T21:49:03Z
Area
SU.WINDOWS.NT.PROG
From: "Alex Fedotov" <me@alexfedotov.com>

Vladislav Volovik wrote:

 >> Народ, никто не знает как такое заюзать (нужно именно сопроц, эмуляцию не
 >> предлагать)
 >> Проблемы:
 >> 1. в WinNT ваще неясно как
 >> 2. в Win2000 ясно как сохранить/востановить контекст fpu, но совсем не
 >> понятно как прилинковать математические функции, да и обычный sprintf(s,
 >> "%f", 12.2) пашет неправильно :-(

1. Начиная с какого-то сервис-пака (я верю, что с третьего, но, пожалуйста,
проверь сам) функции KeSave/RestoreFloatingPointState есть и в NT4.

2. sprintf полагается на инициализацию, которую делает C startup code. В
драйвере такой инициализации нет и использовать ее не получится. Можешь,
конечно, поковыряться в исходниках CRT и посмотреть, как там что
инициализируется, но с большой вероятностью код из CRT просто не будет
работать в драйвере.

2a. Простые вычисления и математические функции не приводят к ссылкам на
библиотечные функции. Например, если у тебя в программе написано

#pragma intrinsic(sin, cos)

То функции sin и cos напрямую транслируются в fsin и fcos. К сожалению, это
работает только при включенной оптимизации (отладку ты себе затруднишь
серьезно).

2b. Единственный надежный способ использовать FPU в драйвере (IMHO; пока
кто-нибудь не показал обратное), это делать вставки на ассемблере, где ты
полностью контролируешь ситуацию.

Roman Ukhov wrote:

 RU> Don't use native floating point operations. Windows NT does not support
 RU> kernel-mode floating point operations on some systems. Specifically, the
 RU> Windows NT kernel does not preserve floating point registers on
 RU> kernel-mode stack switches, so using floating point registers in the
 RU> driver corrupts an application's floating point registers.
 RU> ....
 RU> A FLOATOBJ structure is used to emulate a floating point number. This
 RU> structure, in conjunction with the FLOATOBJ_Xxx service routines, allows
 RU> graphics drivers to emulate floating point arithmetic in the NT kernel.
 RU> Floating point arithmetic is not otherwise supported in the Windows NT
 RU> kernel code.

Прежде чем цитировать MSDN, неплохо было бы обратить внимание, что этот кусок
относится к display drivers, а это весьма специфичная область. В частности,
FLOATOBJ доступен только дисплей-драйверам, обычным device drivers он
недоступен.

-- Alex Fedotov

--- ifmail v.2.15
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)