我正在处理一个由多个内核模块组成的项目。不同的模块之间有一些共享的功能,但我不想在每个模块中包含相同的代码。Linux内核是否有一个"共享对象库",或者公共代码是否进入一个单独的模块?
通常,您会将模块的公共功能放在一个单独的模块中。一个很好的例子是其他SAS(串行连接SCSI)设备驱动程序使用的drivers/scsi/libsas
模块。如果您采用这种方法,请参阅Documentation/kbuild/modules.txt
第6.3节中的内核文档,以获取有关引用其他外部模块的符号的建议。
如果您正在寻找在模块之间共享函数的方法,您应该看看EXPORT_SYMBOL
宏。一个简单的例子:
文件super.c
void call_me(){
printk("Hello from super.n");
}
EXPORT_SYMBOL(call_me);
文件super.h
extern void call_me();
文件库.c
#include "super.h"
void call_super(){
call_me();
}
这里super.c和base.c是不同的模块。
如果这是你想要的,请告诉我。我可以给你发一个更复杂的例子,里面有makefile之类的东西。希望能有所帮助。
注意:我在很多发行版中都用过这个。。。然而,每次我这样做时,我都需要将文件Modules.symvers复制到其他每个模块目录中。
假设您有一个模块a和一个模块B,模块B使用a中的函数。编译a后,将创建一个名为Modules.symvers的文件。在编译之前,我需要将该文件复制到B的文件夹中。复制Modules.symvers后,请不要在B的文件夹下发出make clean
,否则它会被删除。