如何在内核源文件中包含math.h #include <math.h>?</math.h>

时间:2009-06-18 13:52:14

标签: c math module kernel

我想在我的Linux内核模块中包含math.h。如果我使用,

#include '/usr/include/math.h'

它给了我这些错误:

error: features.h: No such file or directory
error: bits/huge_val.h: No such file or directory
error: bits/mathdef.h: No such file or directory
error: bits/mathcalls.h: No such file or directory

为什么会这样?

11 个答案:

答案 0 :(得分:9)

你不能在内核模块中使用C库,对数学库部分来说更是如此。

答案 1 :(得分:4)

您不能在内核空间中包含用户空间C模块。你还确定你想要这样做吗?这个帖子可以帮助http://kerneltrap.org/node/16570。你可以在内核中做数学函数,只需在http://lxr.linux.no/上搜索你需要的函数。

答案 2 :(得分:4)

内核中没有标准库。这包括libc,libm等。虽然这些库中的一些函数在内核空间中实现,但有些不是。如果不知道你要调用什么,就不可能肯定地说你是否应该在内核空间中做你想做的事情。

我应该进一步注意内核无法访问FPU。这是为了节省切换任务的时间(因为保存FPU寄存器会在执行上下文切换时增加不必要的开销)。如果您真的需要,可以从内核空间访问FPU,但是在执行此操作时需要非常小心不要丢弃用户空间的FPU寄存器。 < / p>

编辑:This总结了关于FPU的警告,比我做得更好。

答案 3 :(得分:2)

内核不支持浮点运算。这是因为从内核上下文切换到用户上下文时,必须保存寄存器。如果内核会使用浮点,那么也必须保存浮点寄存器,这会导致每个上下文切换的性能不佳。因为很少需要浮点,特别是在内核中它不受支持。

如果你真的需要:

  • 也许您可以使用浮点支持编译自己的内核
  • 您可以在浮点运算中阻止上下文切换
  • 最好的方法是使用定点算术。

答案 4 :(得分:1)

AFAIK内核空间与用户空间分开,源代码也是如此。 / usr / include用于一般编程。

答案 5 :(得分:1)

This表明在内核中进行浮点运算并不像用户空间代码那么简单。 Another实例表明这很难。

仍在寻找更明确的答案。

答案 6 :(得分:0)

非常感谢你的评论

使用数学函数

是否可以制作一个平面C应用程序并从内核源文件传递变量。因此C应用程序将计算变量并发回信息。

内核源文件(内核空间) ---&gt; C应用程序(用户空间)

                                       |

                                   <---|

内核源文件

因此我们可以在内核源代码中包含头文件。如果发生任何事件,它会将值传递给C应用程序(用户空间)

<强> 详细说明: 我正在尝试修改我的HID操纵杆事件(绝对x,y)因此它可能只会移动到改进的位置,这将由我的应用程序生成,具有一些数学函数,如(pow,tan等)。

所以我使用hid-input.c来获取原始事件并修改它们。它将通过hid内核模块用于输入子系统 -

寻找您的意见

问候。

答案 7 :(得分:0)

你不能,你可以在你的模块中重写你需要的功能,它很脏但它应该有用......

答案 8 :(得分:0)

你不能(通常,没有很多内核专有技术来锁定和保存这些寄存器而不影响其他关键部分)在内核中使用浮点寄存器,此外它当然不适合做“处理”。核心。许多人都提到了这一点。表现会很糟糕。因此,没有为内核模块提供math.h。我们接受这一点并继续......

然而,因为我也是疯狂要求的受害者和被他人强加给我们的完全疯狂的设计,这是一个合理的问题。在减少math.h API的使用以最小化性能影响之后,您可以通过正确的编译器设置使用浮点仿真(软浮点)来实现所需的函数,而无需使用浮点寄存器。内核代码应该已经使用这些soft-float设置进行编译。

为了实现math.h功能,您可以查看glibcuClibc以及其他人。这两个库都有libm的通用“C”实现,它们实现math.h而不使用特殊的内在函数或特定于平台的类型,因此应该在内核中编译得很好。

uClibc:上面的链接将您直接带到uClibc的libm部分。

glibc:在“git”-ing glibc之后,你会在glibc / sysdeps / ieee754 / flt-32找到你想要的东西。

glibc可能更难以理解,因为它更复杂并且本身具有更多的相互依赖性,但uClibc仅提供(目前)C89 math.h.如果您想要单精度(读取:更快)或复杂的数学功能,如C99 +,您将不得不看glibc。

答案 9 :(得分:-1)

也许尝试使用双引号(“)而不是单引号?

答案 10 :(得分:-1)

在专家看来,它不是在内核空间和用户空间之间传递数据的好方法。完全处理内核空间或仅在用户空间上工作。

但是一个解决方案可以在内核模块中使用 read() write()命令在用户空间和内核空间之间发送信息。