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

例如:


kernelmodule.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头文件之外。是否可以包含此功能,如果可以,请指出我正确的方向。

谢谢, 麦克

有帮助吗?

解决方案

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

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

无法将内核与为用户空间使用而设计的库链接 - 即使它们没有进行任何OS调用 - 因为内核中的链接环境无法接收它们。

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


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


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

其他提示

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

只能链接用户空间DSO是不可能的&#8212; Linux内核是单片的,完全自包含。它没有像其他人所指出的那样使用用户空间libc,库或其他位。

9/10次,您将在内核中找到某处所需的内容。很可能其他人遇到了你需要的东西,并在某个模块中编写了一些静态函数来做你想做的事情。只需抓住它们并重新使用它们。

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

因此,一方面,我们“只需复制和重命名内容,同时添加整体膨胀”,另一方面,您“告诉人们必须拥有完整的内核源代码”。这是整体内核带来的怪癖之一。

使用Microkernel,几乎所有内容都在用户空间中运行,无需担心某些驱动程序与DSO相关联......这不是问题。请不要将该声明作为在评论中重新启动内核设计理念的提示,这不在本问题的范围内。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top