导出符号使用demon
第一种:
文件:math.c math.h module.c
思路:在math.c中定义需要导出的函数,然后导出。
在module.c中使用导出的函数。
代码如下:
math.h
#include<linux/init.h>
#include<linux/module.h>
int add(int a,int b)
{
return a+b;
}
EXPORT_SYMBOL(add);//导出后才能供外部使用
int sub(int a,int b)
{
return a-b;
}
EXPORT_SYMBOL(sub);//导出后才能供外部使用
MODULE_LICENSE("GPL");
如果不使用导出报错: unknown symbol in module or invalid parameter
math.h
#ifndef __MATH_H__
#define __MATH_H__
int add(int a,int b);
int sub(int a,int b);
#endif
module.c
#include<linux/init.h>
#include<linux/module.h>
#include"math.h"
int number1=10;
int number2=1;
static int __init hello_init(void)
{
printk("===============%s===============\n",__FUNCTION__);
printk("number1=%d\n",number1);
printk("number2=%d\n",number2);
printk("number1+number2=%d\n",add(number1,number2));
printk("number1-number2=%d\n",sub(number1,number2));
return 0;
}
static void __exit hello_exit(void)
{
printk("===============%s===============\n",__FUNCTION__);
}
/*这样就可以传递参数了*/
module_param(number1,int,0644);
module_param(number2,int,0644);
/*
*传参用法:insmod module2.ko number=222 name="zhang"
*/
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
运行结果:
[root@farsight /drv_module]# insmod math.ko
[root@farsight /drv_module]# insmod module3.ko
===============hello_init===============
number1=10
number2=1
number1+number2=11
number1-number2=11
ps:注意模块的装载顺序否则不成功
第二种用法(来源网络未证实):
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
static int function_one(void)
{
printk("EXPORT_SYMBOL In Func: %s...\n",__func__);
return 0;
}
EXPORT_SYMBOL(function_one);//此处导出符号
static int __init export_symbol_init(void)
{
printk("EXPORT_SYMBOL Module one,Init!\n");
return 0;
}
static void __exit export_symbol_exit(void)
{
printk("EXPORT_SYMBOL Module one,Exit!\n");
}
module_init(export_symbol_init);
module_exit(export_symbol_exit);
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
static int function_two(void)
{
extern int function_one(void);//需要声明
function_one();
printk("EXPORT_SYMBOL In Func: %s...\n",__func__);
return 0;
}
static int __init export_symbol_init(void)
{
printk("EXPORT_SYMBOL Module two,Init!\n");
function_two();
return 0;
}
static void __exit export_symbol_exit(void)
{
printk("EXPORT_SYMBOL Module two,Exit!\n");
}
module_init(export_symbol_init);
module_exit(export_symbol_exit);
对比:前者类似C语言的写法,但多了一个导出符号。
后者是两个独立的驱动程序之间共享函数,此方法不需要包含头文件也没有头文件。
需要一方导出另一方用extern声明外部引用。
共同点:导出符号的KO文件需要先于调用的KO装载进内核,卸载时相反。