导出符号使用demon

导出符号使用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装载进内核,卸载时相反。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值