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)