我试图在 C 代码中定义一个双数据类型变量,该变量将在 Windows 内核中使用。代码可以编译,但在链接时出错。我尝试在源文件中使用 libcntpr.lib 并在代码中定义 __fltused 变量,但无济于事。如果有人可以帮助我如何使用它,我将非常感激。
不知道是否仍然适用于当前的 WDK,但 Walter Oney 阻止了在驱动程序中使用浮点内容here.
问题比仅仅找到合适的库更糟糕,
很遗憾。 C 编译器的浮点支持假设它
将在一个应用程序环境中运行,您可以
初始化协处理器,安装一些异常处理程序,然后
爆炸。它还假设操作系统会照顾
根据需要保存和恢复每个线程的协处理器上下文
从那时起发生的所有线程上下文切换。
这些假设对于驾驶员来说通常并不成立。此外,
运行时库对协处理器异常的支持无法工作,因为
有一大堆缺失的基础设施。
您基本上需要做的就是以这样的方式编写代码:
每次要使用协处理器时都对其进行初始化(不要
忘记 KeSaveFloatingPointState 和 KeRestoreFloatingPointState)。放
以便协处理器永远不会生成异常,
也。然后你可以简单地在某处定义符号 __fltused
满足链接器。 (该符号通常所做的就是将其拖入
运行时支持。你不需要这种支持,因为正如我所说,它
在内核模式下不起作用。)毫无疑问,您需要一些汇编
初始化步骤的语言代码。
如果您有一个系统线程将执行所有浮点运算
数学,您可以在开始时初始化协处理器一次
线。系统将根据需要保存和恢复您的状态
然后继续。
不要忘记你只能在 IRQL
除其他外,还有 FINIT。如果您对协处理器感到生疏
编程,我的建议是告诉你的管理层,这是一个
需要大量研究才能解决的专门问题。
然后飞往马提尼克岛一周左右(飓风季节过后,
即)在适当的环境中进行研究。
说真的,如果您不熟悉 FINIT 和其他数学协处理器
说明,这可能不是你应该做的事情
合并到您的驱动程序中。
微软还发布了一篇有趣的文章:用于内核模式驱动程序的 C++:优点和缺点
在 x86 系统上,浮点和多媒体单元不是
除非特别要求,否则可在内核模式下使用。尝试使用
它们不正确可能会或可能不会导致浮点故障
IRQL(这会导致系统崩溃),但可能会导致静默数据
随机过程中的腐败。使用不当也会造成数据
其他流程中的腐败;此类问题往往很难解决
调试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)