EXPORT_SYMBOL使用

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://www.cnblogs.com/Caden-liu8888/p/7725293.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术人写作和写代码一样重要

也许当你老了会发出这样的感叹“曾经有无数条发财致富的道路摆在我面前&#xff0c;我不知道珍惜&#xff0c;现在老了才追悔莫及”。写技术文章无疑是做技术人工作之外一条很好的知识变现之路。而我也才最近顿悟&#xff0c;下定决心开始在coding的闲暇时间围绕自己的工作和兴…

ejb jsf jpa_完整的WebApplication JSF EJB JPA JAAS –第1部分

ejb jsf jpa这篇文章将是迄今为止我博客中最大的一篇文章&#xff01; 我们将看到完整的Web应用程序。 最新的技术&#xff08;直到今天&#xff09;都将完成&#xff0c;但是我将给出一些提示以显示如何使本文章适应较旧的技术。 在本文的结尾&#xff0c;您将找到要下载的源代…

Jzoj4782 Math

若一个数x是平方数&#xff0c;则d(x)为平方数 所以就是要考虑有多少对i*j为平方数 我们假设&#xff0c;ip*k^2&#xff0c;那么&#xff0c;jp*q^2时&#xff0c;i*j为平方数&#xff08;p不含平方因子&#xff0c;k&#xff0c;q为正整数&#xff09; 所以&#xff0c;我们对…

前端暗黑模式,你了解多少

关于使用越来越多的前端暗黑模式&#xff0c;手机的app或网站都将支持暗黑模式逐渐成为一种规范&#xff0c;这样做的目的是什么呢&#xff1f;从我最初的理解是为了在黑暗的环境下屏幕上阅读的体验考虑&#xff0c;但是看了文摘却有另一种意义。暗黑模式究竟能不能起到省电的作…

两全其美的

使用抽象文档模式的类型安全视图 您如何组织对象&#xff1f; 在本文中&#xff0c;我将介绍一种模式&#xff0c;该模式以无类型的方式在您的系统中组织所谓的名词类&#xff0c;然后使用特征公开数据的类型化视图。 这使得只需少量的牺牲就可以在Java之类的语言中获得JavaScr…

Windows内核函数

字符串处理 在驱动中一般使用的是ANSI字符串和宽字节字符串&#xff0c;在驱动中我们仍然可以使用C中提供的字符串操作函数&#xff0c;但是在DDK中不提倡这样做&#xff0c;由于C函数容易导致缓冲区溢出漏洞&#xff0c;针对字符串的操作它提供了一组函数分别用来处理ANSI字符…

前端应该关注的2021年UI设计趋势

UI设计趋势几乎每年都在发生变化&#xff0c;变化的原因是人们的审美在变导致的&#xff0c;还是设计越来越人性化。市场上是谁在主导设计趋势&#xff1f;其中原因不得而知&#xff0c;我们先看看究竟有哪些变化&#xff1a;1. 3D插图&#xff08;依然流行&#xff09;3D图像将…

如何让你在开发者工具中查看源代码有语法高亮和暗黑主题的效果

如何让你在Chrome浏览器开发者工具中查看源代码的时候&#xff0c;和在代码编辑器中有同样的代码语法高亮的效果&#xff0c;而且还是深色主题&#xff0c;如果你是深色主题的爱好者就更合你意了。国外的美女开发者为你实现了这样功能的浏览器拓展&#xff0c;她的Github主页&a…

Hitting refresh on my career(译)----重新定义我的事业

我是在PlanetXamarin这个网站上&#xff0c;看到的这篇文章&#xff0c;看完后&#xff0c;觉得挺能引起人的思考的,特别是我们广大程序员. "Hit Refresh"这两个单词&#xff0c;字面上理解&#xff1a;点击刷新按钮. 国内有人翻译为"拥抱变革",我觉得“拥…

冒泡排序 快速排序 插入排序 选择排序

最近面试好多公司考察算法&#xff0c;特意整理了一下&#xff1a; 1. 冒泡排序思路分析&#xff1a;在要排序的一组数中&#xff0c;对当前还未排好的序列&#xff0c;从前往后对相邻的两个数依次进行比较和调整&#xff0c;让较大的数往下沉&#xff0c;较小的往上冒。即&…

“太空语言”JavaScript编码标准规范指南

喷气推进实验室是 美国国家航空航天局的科研机构。 该实验室JPL开发大部分的软件是用在无人深度太空和其他行星探测的领域。他们拥有著名的 好奇号火星探测器 和 旅行者号探测器 。已经离开太阳系25年&#xff0c;仍然在飞行并提供科学信息。高水平的自动化和长期的任务导致了对…

如何在JUnit 5中替换规则

最近发布的JUnit 5&#xff08;又名JUnit Lambda&#xff09; Alpha版本引起了我的兴趣&#xff0c;在浏览文档时&#xff0c;我注意到规则以及跑步者和阶级规则都消失了。 根据文档&#xff0c;这些部分竞争的概念已被单个一致的扩展模型取代。 多年来&#xff0c; Frank和我…

sikuli 搜索例子

#coding:utf-8kw input(u"请输入您要搜索的关键字:")#openAPP(‪C:\Users\ceshi\AppData\Local\Google\Chrome\Application\chrome.exe)doubleClick("asm.png")wait("fEDi.png")type(Key.CTRL)type(www.baidu.com)type(Key.TAB)sleep(1)type(kw…

微页面设计开发指南

一、目标实现左侧&#xff1a;为可用的组件列表&#xff0c;可拖动任一组件到中间的预览区域中间&#xff1a;为页面预览效果页面&#xff0c;选中任一组件&#xff0c;可在右侧进行参数配置右侧&#xff1a;为组件的参数配置&#xff08;选中中间的组件时出现&#xff09;&…

商城商品购买数量增减的完美JS效果

商城商品购买数量增减的完美JS效果 近期在开发一个地方O2O租书项目&#xff0c;使用ASP.NET MVC技术&#xff0c;其中在图书详情页&#xff0c;用户可以输入借阅的数量&#xff0c;这里使用了js来控制数量的增减和校验。 数量一定是数字 点击增减按钮的时候要能自动加1或减1 …

这款插件让你在VSCode上也能答题背单词

在VSCode上也可以在线答题了&#xff0c;插件市场上线了一款答题的插件&#xff0c;免去了去其它网站或者软件的烦恼&#xff0c;代码写累了&#xff0c;随手打开答题功能&#xff0c;换换脑子&#xff0c;或者熟悉两个单词&#xff0c;程序员的别样休闲时光&#xff0c;哈哈&a…

java jaas_基于Java JAAS表单的身份验证

java jaas使用JAAS实现登录模块是一个高级主题&#xff0c;而且大多数开发人员也很少有机会参与这种开发。 但是JAAS登录模块的基本实现不是那么难实现&#xff0c;这是因为我打算将其发布。 在这里&#xff0c;我正在解释如何实现tomcat管理的身份验证模块。 此实现与容器无关…

在ubuntu上如何将多张图片或PDF合到一个PDF上

在日常工作中我们可能需要将不同的PDF或图像合并为一个PDF上&#xff0c;这种情况并不少见。 这时候我们需要学习使用一个非常强大的命令行工具ImageMagick。通过apt命令下载安装ImageMagick在Ubuntu 20.04版本中已经预装了ImageMagick&#xff0c;因为有许多软件包使用此工具作…

使用Java 8在地图上流式传输

在本文中&#xff0c;我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流&#xff0c;并将Stream接口扩展为MapStream&#xff01; 即使在复杂的情况下&#xff0c;此添加将使保持流的具体性和可读性变得更加容易。 希望这将允许您继续流式传输而不会过早收集…

日期差值 1096

问题描述 链接&#xff1a;https://www.nowcoder.com/questionTerminal/ccb7383c76fc48d2bbc27a2a6319631c 有两个日期&#xff0c;求两个日期之间的天数&#xff0c;如果两个日期是连续的我们规定他们之间的天数为两天 输入描述: 有多组数据&#xff0c;每组数据有两行&#x…