我为内核开发了两个简单的模块。现在我想在一个模块中定义一个函数,然后在另一个模块中使用它。
我怎么能这样做?
只需在其他模块中定义函数和调用程序而不会出现问题吗?
答案 0 :(得分:29)
在module1.c
中定义:
#include <linux/module.h>
int fun(void);
EXPORT_SYMBOL(fun);
int fun(void)
{
/* ... */
}
并在module2.c
:
extern int fun(void);
答案 1 :(得分:0)
Linux内核允许模块堆叠,这基本上意味着一个模块可以使用其他模块中定义的符号。但这仅在导出符号时才可行。 让我们利用最基本的hello world模块。在此模块中,我们添加了名为“ hello_export”的函数,并使用EXPORT_SYMBOL宏导出了此函数。
hello_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);
module_init(hello_init); module_exit(hello_exit); 准备一个Makefile,使用“ make”命令编译它,然后使用insmod将其插入内核。 $ insmod hello_export.ko 内核知道的所有符号都在/ proc / kallsyms中列出。让我们在此文件中搜索我们的符号。
$ cat / proc / kallsyms | grep hello_export d09c4000 T hello_export [hello_export]
从输出中我们可以看到,导出的符号已在内核识别的符号中列出。