2009-05-03 100 views
7

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

例如:


kernelmodule.h

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

的Makefile

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 

我写的内核模块,并试图编译包含发现功能一些o penssl包含文件。

上面提供的标准makefile不允许包含在linux头之外。是否可以包含这个功能,如果可以的话,请指点一下正确的方向。

谢谢, 迈克

回答

11

内核不能使用用户空间代码,必须独立(即完全独立的,没有库),因此它不会拿起标准的头。

试图挑选用户空间标题有什么好处是不明确的。如果有些东西可以使用它们(常量,某些宏或许提供了它们不会调用任何用户空间函数),那么复制它们可能会更好,并且只包含您需要的与内核兼容的部分。

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

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


最新的Linux版本包含加密功能,无论如何,包括各种SHA哈希 - 也许你可以使用其中的一个来代替。


另一个想法是停止试图做内核空间密码和代码移动到用户空间。用户空间代码更容易编写/调试/维护等。

6

我已经写了一些用户空间代码,并将其转换为内核空间(例如使用kmalloc()等),但并不那么困难。然而,你仅限于内核对C的理解,而不是用户空间,它略有不同,特别是对于各种标准的int类型。

只与用户空间DSO链接是不可能的 - Linux内核是单片的,完全独立的。它不像其他人所说的那样使用用户空间libc,库或其他位。

9/10次,你会在内核中找到你需要的东西某处。很有可能其他人遇到了同样的需求,并在某些模块中编写了一些静态函数以实现您想要的功能。只需抓住这些并重新使用它们即可。

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

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

有了Microkernel,几乎所有的东西都在用户空间中运行,无需为某些驱动程序与DSO进行链接......这不是问题。请不要把这个陈述作为重新启动内核设计理念的提示,这不在这个问题的范围之内。