linux驱动代码中经常可以看到这个宏定义,那么这个宏定义的作用是什么呢?
其实就是在这个宏定义内的函数或者标签对整个内核是公开其符号表,意思就是直接可以在内核了得其他模块直接调用,而不需要修改内核代码。
一个简单的例子:
// Module A (moduleA.c)
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
static int func1(void)
{
printk("In Func1: %s...\n", __func__);
return 0;
}
static int __init moduleA_init(void)
{
printk("Module A init ok!\n");
return 0;
}
static void __exit moduleA_exit(void)
{
printk("Module A Exit ok!\n");
}
// export the symbol of func1
EXPORT_SYMBOL(func1);
module_init(moduleA_init);
module_exit(moduleA_exit);
// Module B (moduleB.c)
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
static int func2(void)
{
printk("In Module B,and call module A's function!\n");
func1();
printk("In Func: %s...\n",__func__);
return 0;
}
static int __init moduleB_init(void)
{
func2();
return 0;
}
static void __exit moduleB_exit(void)
{
printk("Module B Exit!\n");
}
module_init(moduleB_init);
module_exit(moduleB_exit);
注意:
由于是模块B调用模块A,所以加载驱动的时候需要先加载模块A
insmod moduleA.ko
insmod moduleB.ko