如何在一个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,但我不知道确切的详细信息。的可能重复