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

时间:2012-03-22 10:29:11

标签: linux module kernel

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

我怎么能这样做?

只需在其他模块中定义函数和调用程序而不会出现问题吗?

2 个答案:

答案 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]

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