shjdriver
驱动牛犊
驱动牛犊
  • 注册日期2003-04-01
  • 最后登录2008-04-02
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望30点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
阅读:969回复:2

wdm的数据类型

楼主#
更多 发布于:2003-05-13 08:35
我做了一个WDM驱动程序,在程序里面我使用了一个float变量,但编译时出错
Linking...
hard.obj : error LNK2001: unresolved external symbol __fltused
.\\objchk\\i386\\PartIoDriverShj.sys : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
当不用此浮点变量或改为int就正确,我的程序里需要float型变量,请各位帮我解决,谢谢
AthlonXP
驱动小牛
驱动小牛
  • 注册日期2003-05-11
  • 最后登录2010-01-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-13 10:57

 浮点运算
有时候整数运算并不能满足要求,我们需要浮点运算。在Intel处理器上,浮点协处理器还可以执行MMX指令。在历史上,驱动程序在执行浮点运算上有两个问题。对于没有浮点协处理器的计算机,操作系统将用软件仿真一个,但是仿真的浮点协处理器会消耗很大的CPU处理能力,并且需要一个处理器异常来捕捉浮点指令。在内核模式中处理异常,尤其是在提升的IRQL级上,是困难的。另外,在有浮点协处理器的计算机上,由于CPU结构上的原因,当线程上下文切换时,需要一个耗时的操作来保存和恢复浮点协处理器的状态。所以,通常的做法是禁止在内核模式驱动程序中使用浮点运算。

Windows 2000和Windows 98提供了一种方法来绕过这个问题。首先,有一个运行在低于或等于DISPATCH_LEVEL级上系统线程,该线程可以自由地使用浮点协处理器。另外,运行在低于或等于DISPATCH_LEVEL级上的任意线程背景的驱动程序可以调用两个系统函数,用这两个函数调用可以把浮点运算程序括起来:

ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
KFLOATING_SAVE FloatSave;
NTSTATUS status = KeSaveFloatingPointState(&FloatSave);
if (NT_SUCCESS(status))
{
  ...
  KeRestoreFloatingPointState(&FloatSave);
}
 

这两个调用必须成对出现,它们为当前CPU保存和恢复浮点协处理器状态,即浮点协处理器的状态可以维持到任意多个指令周期。这个状态信息包括寄存器、控制字,等等。而在某些其它种类的CPU上,这两个调用不做任何事,因为这种CPU在线程切换时可以自动保存和恢复浮点协处理器的状态。出于这种原因,Microsoft建议,除非必要,应避免在内核模式驱动程序中使用浮点运算。

调用KeSaveFloatingPointState时发生了什么,不同的CPU结构会有不同的答案。例如,在Intel处理器上,该函数通过执行FSAVE指令把整个浮点处理器状态保存起来。它既可以把状态信息保存到当前线程的上下文块中,也可以保存到一块动态分配的内存区中。它还用一个不透明的FloatSave区记录关于被保存状态的中间信息,这可以使KeRestoreFloatingPointState正确地恢复浮点协处理器的状态。

如果系统没有浮点协处理器,KeSaveFloatingPointState将失败并返回STATUS_ILLEGAL_FLOAT_CONTEXT代码。(顺便提一下,多CPU计算机的每个CPU必须同时拥有或同时没有协处理器) 因此你的驱动程序必须以其它方式实现浮点计算,或者干脆拒绝把驱动程序装入无浮点处理器的计算机上(由于DriverEntry的失败)。


Walter Oney, 《Programming the Microsoft Windows Driver Model》
AthlonXP是个好人,他一生没有欺压过同侪,没有背叛过朋友。从小到大,他都是个好孩子,没有出过什么差错,没有让家人师长担过心。虽然用一句时髦的话,他不善于"推销"自己,但是做学问扎扎实实,不会投机取巧;做工作也是一步一个脚印,不会敷衍塞责。他虽然是个大烟枪,偶尔也喝喝酒,但是没有什么见不得人的恶习。他花钱虽然不特别大方,可是也不吝啬。许多不如他的人,或幸或不幸,一般的也都成了家。可是为什么MM不喜欢他呢??
AthlonXP
驱动小牛
驱动小牛
  • 注册日期2003-05-11
  • 最后登录2010-01-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-13 11:01
这是walter oney写的关于浮点的例子:
附件名称/大小 下载次数 最后更新
2003-05-13_fputest.rar (191KB)  9
AthlonXP是个好人,他一生没有欺压过同侪,没有背叛过朋友。从小到大,他都是个好孩子,没有出过什么差错,没有让家人师长担过心。虽然用一句时髦的话,他不善于"推销"自己,但是做学问扎扎实实,不会投机取巧;做工作也是一步一个脚印,不会敷衍塞责。他虽然是个大烟枪,偶尔也喝喝酒,但是没有什么见不得人的恶习。他花钱虽然不特别大方,可是也不吝啬。许多不如他的人,或幸或不幸,一般的也都成了家。可是为什么MM不喜欢他呢??
游客

返回顶部