我们在编写Linux驱动的时候可以通过模块化的方式来实现,我们编写一个模块并把它加载进内核中以完成某些功能,在一个内核模块中往往包含了很多功能函数,默认情况下只有本模块才能调用这些函数,例如:
#include<linux/init.h>
#include<linux/module.h>
int add_func(int a,int b)
{
return a+b;
}
static int xxx_init(void)
{
int ret = add_func(1,2);
return ret;
}
static void xxx_exit(void)
{
}
module_init(xxx_init);
module_exit(xxx_exit);
MODULE_LICENSE("GPL");
上面是一个简单的模块代码,在这个模块中定义了一个函数 add_func(),此函数只能在模块内调用,如果另外有一个模块想调用此函数就需要吧add_func()函数导出,Linux使用宏EXPORT_SYMBOL()来导出符号(即把函数导出让其他模块能看见并调用)。使用方法如下:
EXPORT_SYMBOL(functionname)
如果我们要导出上面一个例子中的add_func()函数,以便让其他模块也能调用add_func()可以把上面的例子改成:
#include<linux/init.h>
#include<linux/module.h>
int add_func(int a,int b)
{
return a+b;
}
static int xxx_init(void)
{
int ret = add_func(1,2);
return ret;
}
static void xxx_exit(void)
{
}
module_init(xxx_init);
module_exit(xxx_exit);
EXPORT_SYMBOL(add_func);
MODULE_LICENSE("GPL")
这时其他的模块就可以调用上面这个例子中的add_func()函数了,当然定义add_func()的模块必须先加载金进内核,其他调用add_func()的模块才能正确的加载到内核并调用add_func()函数。例如另外有个test模块:
#include<linux/init.h>
#include<linux/module.h>
static int test_init(void)
{
int ret = add_func(1,2);
return ret;
}
static void test_exit(void)
{
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
<pre code_snippet_id="335101" snippet_file_name="blog_20140508_2_5827155" name="code" class="cpp"><pre code_snippet_id="335101" snippet_file_name="blog_20140508_2_5827155" name="code" class="cpp"><pre code_snippet_id="335101" snippet_file_name="blog_20140508_2_5827155">