7

是否可以编译包含非内核定义的功能的 linux 内核(2.6)模块?

例如:


内核模块.h

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>   // printk()
// ...
#include <openssl/sha.h>
// ...

生成文件

obj-m := kernelmodule.o
all:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
    $(RM) Module.markers modules.order

我编写并尝试编译的内核模块包含许多 openssl 包含文件中的功能。

上面介绍的标准 makefile 不允许包含在 linux 头文件之外。是否可以包含此功能,如果可以,请您指出正确的方向。

谢谢,迈克

4

2 回答 2

11

内核不能使用用户空间代码并且必须独立(即完全自包含,没有库),因此它不选择标准头文件。

目前尚不清楚尝试获取用户空间标头有什么好处。如果其中有一些可以使用的东西(常量,一些宏可能提供它们不调用任何用户空间函数),那么最好复制它们并仅包含您需要的内核兼容部分。

无法将内核与为用户空间使用而设计的库链接——即使它们不进行任何操作系统调用——因为内核中的链接环境无法获取它们。

相反,重新编译要在内核中使用的任何函数(假设它们不进行任何操作系统或库调用 - 例如 malloc - 在这种情况下无论如何都需要修改它们)。将它们合并到您自己的库中以在您的内核模块中使用。


无论如何,最新版本的 linux 都包含加密功能,包括各种 SHA 哈希 - 也许您可以使用其中之一。


另一个想法是停止尝试在内核空间中进行加密并将代码移动到用户空间。用户空间代码更容易编写/调试/维护等。

于 2009-05-03T21:46:44.323 回答
6

我已经编写了一些用户空间代码并将其转换为在内核空间中工作(即使用 kmalloc() 等),这并不难。但是,您仅限于内核对 C 的理解,而不是用户空间,这略有不同.. 尤其是对于各种标准 int 类型。

仅仅链接到用户空间 DSO 是不可能的——Linux 内核是单片的,完全自包含的。正如其他人所指出的,它不使用用户空间 libc、库或其他位。

9/10 次,你会在内核的某个地方找到你需要的东西。很可能其他人遇到了与您相同的需求并在某些模块中编写了一些静态函数来执行您想要的操作..只需抓住这些并重新使用它们。

正如其他人所说,在加密的情况下,只需使用内核中的内容。需要注意的一件事是,您需要在 kconfig 中启用它们,这可能会发生也可能不会发生,具体取决于用户在构建它时选择的内容。因此,请注意依赖关系并明确表示,您可能必须破解 kconfig 中的一些条目,这些条目还会在选择模块时选择您想要的加密 API。当用树构建时,这样做可能会有点痛苦。

所以一方面我们“在增加整体膨胀的同时复制和重命名东西”,另一方面你“告诉人们他们必须拥有完整的内核源代码”。这是单片内核带来的怪癖之一。

使用微内核,几乎所有东西都在用户空间中运行,不用担心链接到某个驱动程序的 DSO ......这不是问题。请不要将该声明作为在评论中重新启动内核设计理念的提示,这不在此问题的范围内。

于 2009-05-04T07:49:15.497 回答