如何在一个linux内核模块中定义函数并在另一个内核模块中使用它?

如何在一个linux内核模块中定义函数并在另一个内核模块中使用它?,linux,module,kernel,Linux,Module,Kernel,我为内核开发了两个简单的模块。现在我想在一个模块中定义一个函数,然后在另一个模块中使用它 我怎么能做到 只需在另一个模块中定义函数和调用者,没有问题?在module1.c中定义它: #include <linux/module.h> int fun(void); EXPORT_SYMBOL(fun); int fun(void) { /* ... */ } extern int fun(void); Linux内核允许模块堆叠,这基本上意味着一个模块可以使用其他模块中

我为内核开发了两个简单的模块。现在我想在一个模块中定义一个函数,然后在另一个模块中使用它

我怎么能做到


只需在另一个模块中定义函数和调用者,没有问题?

module1.c
中定义它:

#include <linux/module.h>

int fun(void);
EXPORT_SYMBOL(fun);

int fun(void)
{
    /* ... */
}
extern int fun(void);

Linux内核允许模块堆叠,这基本上意味着一个模块可以使用其他模块中定义的符号。但这只有在导出符号时才可能实现。 让我们使用非常基本的hello world模块。在此模块中,我们添加了名为“hello_导出”的函数,并使用导出符号宏导出此函数

你好(u export.c)

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); 
static int hello_init(void)
{ 
  printk(KERN_INFO "Hello,world");
   return 0; 
}
static hello_export(void) {
 printk(KERN_INFO "Hello from another module");
return 0;
} 
static void hello_exit(void) 
{ 
  printk(KERN_INFO "Goodbye cruel world"); 
} 
EXPORT_SYMBOL(hello_export);
#包括
#包括
模块许可证(“双BSD/GPL”);
静态int hello_init(void)
{ 
printk(KERN_INFO“你好,世界”);
返回0;
}
静态hello_导出(void){
printk(KERN_INFO“来自另一个模块的你好”);
返回0;
} 
静态void hello_退出(void)
{ 
printk(KERN_信息“再见残酷世界”);
} 
导出符号(hello\u导出);
模块_init(hello_init); 模块退出(你好退出); 准备一个Makefile,使用“make”命令编译它,然后使用insmod将其插入内核。 $insmod hello_export.ko 内核知道的所有符号都列在/proc/kallsyms中。让我们在此文件中搜索我们的符号

$cat/proc/kallsyms | grep hello |出口 d09c4000 T hello_导出[hello_导出]


从输出中,我们可以看到我们导出的符号列在内核识别的符号中

我还有一个问题。在目录/var/log/i中打开文件messages,查看printk done buy my函数。出现如下消息:“模块许可证”未指定“污染内核”,“由于内核污染而禁用锁调试”。我只是调用一个模块的函数在另一个模块中打印消息。@Ricardo:这与导出函数无关,只是因为您没有定义模块的许可证。使用
MODULE\u LICENSE
宏执行此操作。正在运行。非常感谢。对于内核映像中的模块,是相同的过程吗?如果将这些模块添加到Linux内核,并将它们都设置为模块编译,会发生什么情况?当尝试
make
时,内核将不会编译,因为它无法解析module2.c中对foo()的引用,对吗?怎么解决呢?@JanHudec@marcocamejo:您需要指定module2依赖于module1,但我不知道确切的详细信息。的可能重复