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

我想在我的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 

为什么是这样?

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

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

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

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

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

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

如果你真的需要:

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

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

这表明在内核中进行浮点数学运算并不像用户空间代码那么简单。 另一个例子表明这很难。

仍在寻找更明确的答案。

好吧你不能,你可以在模块中重写你需要的function,它很脏但它应该工作……

非常感谢您的评论

使用数学函数

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

内核源文件(内核空间) —> C应用程序(用户空间)

  | <---| 

内核源文件

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

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

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

寻找你的意见

问候。

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

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

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

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

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

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

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

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

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