extern和EXPORT_SYMPOL
来源:互联网 发布:腾讯视频pad提示无网络 编辑:程序博客网 时间:2024/06/03 20:37
今天又看了看linux的内核的东西,发现很多函数后面都会加上一句EXPORT_SYMPOL()这样的函数,所以今天学习了这样一个函数,以及它和extern的关系。
EXPORT_SYMPOL是2.6内核才有的,作用是什么呢?网上给出的答案是:EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。可以理解为,这个函数在其他地方也可以被调用。extern的解释:在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。下面还是看看用法吧,知道怎么用更靠谱一些。第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名)。第二、在调用该函数的模块中使用extern对之声明。第三、首先加载定义该函数的模块,再加载调用该函数的模块。参考例子如下:
mod1.c#include<linux/init.h>#include<linux/module.h>#include<linux/kernel.h> static int func1(void){ printk("In Func: %s...\n",__func__); return 0;} EXPORT_SYMBOL(func1); static int __init hello_init(void){ printk("Module 1,Init!\n"); return 0;} static void __exit hello_exit(void){ printk("Module 1,Exit!\n");} module_init(hello_init);module_exit(hello_exit); #############################################################mod2.c#include<linux/init.h>#include<linux/kernel.h>#include<linux/module.h> static int func2(void){ extern int func1(void); func1(); printk("In Func: %s...\n",__func__); return 0;} static int __init hello_init(void){ printk("Module 2,Init!\n"); func2(); return 0;} static void __exit hello_exit(void){ printk("Module 2,Exit!\n");} module_init(hello_init);module_exit(hello_exit); ################################################################Makefileifneq ($(KERNELRELEASE),)obj-m := XXXX.oelseKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: rm -rf Module.symvers *.ko *.o *.mod.c .*.cmd .tmp_versions endif ################################################################ #insmod ./mod1.ko#insmod ./mod2.ko#rmmod mod2#rmmod mod1 Jan 11 11:59:17 wangyao-desktop kernel: [ 9886.801010] Module 2,Exit!Jan 11 11:59:21 wangyao-desktop kernel: [ 9891.450214] Module 1,Exit!Jan 11 12:05:29 wangyao-desktop kernel: [10258.385014] Module 1,Init!Jan 11 12:05:38 wangyao-desktop kernel: [10267.465923] Module 2,Init!Jan 11 12:05:38 wangyao-desktop kernel: [10267.465928] In Func: func1...Jan 11 12:05:38 wangyao-desktop kernel: [10267.465930] In Func: func2...Jan 11 12:05:50 wangyao-desktop kernel: [10280.091755] Module 2,Exit!Jan 11 12:05:57 wangyao-desktop kernel: [10287.332596] Module 1,Exit!
可见,在mod2中的func2函数成功的调用了mod1中的func1函数。
- extern和EXPORT_SYMPOL
- extern 和extern "C"
- extern 和 extern“C”
- extern 和 extern "C" 分析summary extern
- extern 和 extern "C" 分析
- extern 和 extern “C”[转载]
- extern 和 extern "C" 分析
- extern “C”和extern “C++ ”
- extern 和 extern "C" 分析
- static、extern和extern "c"
- extern和extern "C"的分析
- extern 和 extern "C" 分析summary
- extern 和extern “C"的问题
- extern 和 extern "C" 分析summary
- 【static&extern】static和extern的区别
- static和extern
- static 和 extern 比较
- static和extern
- 电话本------获取默认文件地址
- 黑马程序员---GUI编程
- firefly+cocos2d-x对战类手机网游《进击的9秒》V1.1源码下载
- 善良公社—JS加我好友
- SQL Server 2008数据库重命名方法
- extern和EXPORT_SYMPOL
- Oracle 表空间与数据文件
- noip2013 简要题解
- 收藏的网站列表
- 【编程之美2.7】求最大公约数的最优算法
- Java 学习笔记
- windows下详细图文教你搭建<进击的9秒>服务端【Firefly】
- 21世纪的文件系统:概述WindowsNT 5.0文件系统(NTFS)(二)
- [HDU 2451] Simple Addition Expression (组合数学 或 数位DPSimple Addition Expression)