EXPORT_SYMBOL使用

EXPORT_SYMBOL使用EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static函数和变量都会自动导入到kernel空间的,都不用EXPORT_SYMBOL()做标记的。2.6就必须用EXPO

大家好,又见面了,我是你们的朋友全栈君。

EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。
2.6就必须用EXPORT_SYMBOL() 来导出来(因为2.6默认不到处所有的符号)。 

1、EXPORT_SYMBOL的作用
EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。

这里要和System.map做一下对比:
System.map 中的是连接时的函数地址。连接完成以后,在2.6内核运行过程中,是不知道哪个符号在哪个地址的。
EXPORT_SYMBOL 的符号, 是把这些符号和对应的地址保存起来,在内核运行的过程中,可以找到这些符号对应的地址。

而模块在加载过程中,其本质就是能动态连接到内核,如果在模块中引用了内核或其它模块的符号,就要EXPORT_SYMBOL这些符号,这样才能找到对应的地址连接。

使用方法:

   第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名)
   第二、在掉用该函数的模块中使用extern对之声明
   第三、首先加载定义该函数的模块,再加载调用该函数的模块

另外,在编译调用某导出函数的模块时,往往会有WARNING: “****” [**********] undefined!
使用dmesg命令后会看到相同的信息。开始我以为只要有这个错误就不能加载模块,后来上网查了一下,发现这主要是因为在编译连接的时候还没有和内核打交道,当然找不到symbol了,但是由于你生成的是一个内核模块,所以LD不提示error,而是给出一个warning,寄希望于在insmod的时候,内核能够把这个symbol连接上。

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。
在模块mod1中,EXPORT_SYMBOL(func1);
在模块mod2中,extern int func1();
就可以在mod2中调用func1了

EXPORT_SYMBOL示范

比如有两个驱动模块:Module A和Module B,其中Module B使用了Module A中的export的函数,因此在Module B的Makefile文件中必须添加:

KBUILD_EXTRA_SYMBOLS += /path/to/ModuleA/Module.symvers

export KBUILD_EXTRA_SYMBOLS

这样在编译Module B时,才不会出现Warning,提示说func1这个符号找不到,而导致编译得到的ko加载时也会出错。

// Module A (mod_a.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  
EXPORT_SYMBOL(func1);  
  
static int __init hello_init(void)  
{  
       printk("Module 1,say hello world!\n");  
       return 0;  
}  
  
static void __exit hello_exit(void)  
{  
       printk("Module 1,Exit!\n");  
}  
  
module_init(hello_init);  
module_exit(hello_exit);  
// Module B (mod_b.c)  
#include<linux/init.h>  
#include<linux/kernel.h>  
#include<linux/module.h>  
extern int functl(void);  
static int func2(void)  
{  
       func1();  
       printk("In Func: %s...\n",__func__);  
       return 0;  
}  
  
static int __init hello_init(void)  
{  
       printk("Module 2,is used Module 1 function!\n");  
       func2();  
       return 0;  
}  
  
static void __exit hello_exit(void)  
{  
       printk("Module 2,Exit!\n");  
}  
  
module_init(hello_init);  
module_exit(hello_exit);  
在驱动加载的时候,一定要先加载定义function1的Module A模块,然后再加载调用function1的Module B的驱动模块。
如下操作:
insmod Module_A.ko  
insmod Module_B.ko  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154295.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 快速解决Android中的selinux权限问题

    快速解决Android中的selinux权限问题关于selinux的详细资料,请查阅http://blog.csdn.net/innost/article/details/19299937在Android开发的过程中,遇到关于selinux相关的东西,当时还一下子看不懂,现在好像有点眉目了。比如,内核打印这个提示type=1400audit(32.939:25):avc:denied{open}forpid=2…

    2022年6月27日
    50
  • jetty idle timeout expired:30000/30000 ms

    jetty idle timeout expired:30000/30000 ms

    2021年9月13日
    193
  • esp-idf的内存管理——tlsf算法

    esp-idf的内存管理——tlsf算法目录1最初还不是tlsf2为什么要引入tlsf3idf中使用的tlsf算法的设计与实现4源码走读参考1最初还不是tlsf2为什么要引入tlsf3idf中使用的tlsf算法的设计与实现4源码走读参考[1]半文钱的博客[2]upstream所在的github地址注意事项放到内存调试去说:用户需要关注的:内存的硬件特性(caps)内存的访问速度内存是否支持原子操作内存是否可以由CPU直接访问用户在使用时:用户自己也要对自己的应用需要使用的内存做一些安排,有的内存比

    2022年6月29日
    22
  • JAVA 中 labeled break 语句

    JAVA 中 labeled break 语句

    2021年9月29日
    39
  • 天气太冷不想出被窝?来DIY一个离线语音控制器[通俗易懂]

    天气太冷不想出被窝?来DIY一个离线语音控制器[通俗易懂]天气太冷不想出被窝?来DIY一个离线语音控制器点击上方“Embeded小飞哥”,选择“置顶/星标公众号”干货福利,第一时间送达!成就一番伟业的唯一途径就是热爱自己的事业。如果你还没能找到让自己热爱的事业,继续寻找,不要放弃。跟随自己的心,总有一天你会找到的。——乔布斯  你去关灯,你去,你去,。。我去。。小伙伴们有没有在天气寒冷时候,想去关灯,却离不开心爱的被窝的经历呢,有的话,跟着小飞哥一起来DIY一个离线语音控制器,有了它,我们

    2022年6月23日
    21
  • JDK8官网下载和安装详细说明(Windows10系统)[通俗易懂]

    JDK8官网下载和安装详细说明(Windows10系统)[通俗易懂]一、JDK官网下载1.点击链接https://www.oracle.com进入Oracle官方网站。2.点击下拉菜单,找到ProductHelp—>Downloads3.点击进入Downloads页面,找到javaJDK4.点击进入JDK下载页面(或直接在浏览器输入链接进入下载页面:https://www.oracle.com/technetwork/java/j…

    2022年7月8日
    224

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号