linux驱动开发--导出内核符号

Linux 驱动开发之内核模块开发(四)—— 符号表的导出 Linux内核头文件提供了一个方便的方法用来管理符号的对模块外部的可见性,因此减少了命名空间的污染(命名空间的名称可能会与内核其他地方定义的名称冲突),并且适当信息隐藏。 如果你的模块需要输出符号给其他模块使用,应当使用下面的宏定义: EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name);   //只适用于包含GPL许可权的模块;      这两个宏均用于 阅读详情

导出内核符号模板代码,验证小实例:

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名称: Esdexp.c
*文件标识: 导出内核符号,此文件中的函数模块被Esdimp.c调用
*
*当前版本:1.0
*作者:wuyq 
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-18
*/
#include <linux/init.h>
#include <linux/module.h>

//声明内核模块的许可权,如果不声明LISCENSE,模块加载时将收到内核被污染(kernel tainted)的警告
MODULE_LICENSE("GPL");

int esdexp_mult(int x, int y)
{
	printk("enter esdexp_mult!\n");
	return (x*y);
}

int esdexp_divd(int x, int y)
{
	printk("enter esdexp_divd!\n");
	return (x/y);
}

/*导出内核符号,定义的函数可以被其他函数调用*/
EXPORT_SYMBOL(esdexp_mult);
EXPORT_SYMBOL(esdexp_divd);

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名称: Esdimp.c
*文件标识: 验证Esdexp.c中的模块
*
*当前版本:1.0
*作者:wuyq 
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-18
*/
#include <linux/init.h>
#include <linux/module.h>
/*两个ko文件, 安装应该有顺序的 modprob*/

//声明内核模块的许可权,如果不声明LISCENSE,模块加载时将收到内核被污染(kernel tainted)的警告
MODULE_LICENSE("GPL");

extern int esdexp_mult(int ,int );
extern int esdexp_divd(int ,int );

static int __init esdimp_init(void)
{
	int result = 0;
	/*编译器、代码可移植性、健壮性 */
	printk("enter esdimp_init!\n");
/*局部变量分配在栈内存中,赋初值。默认不一定为0*/	
/*局部变量应该放在函数内,可执行代码之前。且赋初值。即:函数开头,否则会有警告信息。*/
	result = esdexp_mult(10, 17);
	printk("result = %d\n", result);
	return 0;
}

static void __exit esdimp_exit(void)
{
	int result = 0;
	printk("enter esdimp_exit!\n");
	result = esdexp_mult(1000, 60);
	printk("result = %d\n", result);
}

module_init(esdimp_init);
module_exit(esdimp_exit);

KERNELDIR ?=/root/Desktop/work/ldd3/linux-2.6.31_TX2440A
PWD := $(shell pwd)
obj-m += Esdimp.o Esdexp.o
#obj-m += Esdexp.o

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	@rm -f *.o *.ord* *.sy* *.mod.* *.ko


RK3568 Linux驱动开发:内核模块符号导出原理与实战 在Linux内核开发中,模块化设计是实现代码复用和功能扩展的核心机制。其原理在于每个内核模块拥有独立的符号表,通过显式导出机制(如EXPORT_SYMBOL)将函数或变量加入全局可见表,供其他模块动态链接使用。这一技术价值在于提升驱动开发的模块化程度,减少代码冗余,增强系统可维护性。在嵌入式Linux驱动开发场景中,尤其在RK3568这类多外设SoC平台上,模块间共享硬件操作函数(如GPIO控制、时钟配置)成为常态。通过符号导出,不同驱动模块能高效协同工作,例如GPIO驱动导出引脚强度设置函数供I2C设备驱 阅读详情

相关推荐

Linux驱动开发学习入门第一篇

Linux驱动入门教程一.

m0_44983074的博客 1425

内核模块符号导出

驱动程序可以编译成内核模块,也就是KO文件。每个KO文件是相互独立的,也就是说模块之间无法互相访问。但是在某些使用场、要互相访问,如B模块要用A模块中的函数。(B模块依赖于A模块)这时候我们要怎么做呢?模块可以使用一下宏EXPORT_SYMBOL和EXPORT_SYMBOL_GPL导出符号到内核符号表中。所谓“符号"就是内核中的函数名,全局变量名等。符号表就是用来记录这些“符号"的文件。导出去的符号可以被其他模块使用。使用前只需要声明一下即可。

weixin_52849254的博客 614

Linux PCIe设备驱动开发:从入门到企业级实战 专栏--第2章:Linux内核模块编程 2.2 内核符号导出与模块依赖

本文介绍了Linux内核模块开发中的符号导出与模块依赖机制。主要内容包括:1)内核符号的概念,分为内部符号和导出符号;2)使用EXPORT_SYMBOL和EXPORT_SYMBOL_GPL宏导出函数和变量;3)其他模块如何引用已导出的符号;4)模块依赖的编译、加载顺序管理和自动化工具depmod的使用;5)该机制在PCIe驱动开发中的应用。通过这一机制,开发者可以构建模块化、可重用的内核代码,实现不同模块间的功能调用和资源共享。文章还特别强调了GPL许可证符号的特殊性及其在开源开发中的重要性。

MHD0815的博客 168

内核符号导出例子

/proc/kallsyms 记录了内核中所有导出的符号的名字与地址。 内核符号的导出使用: EXPORT_SYMBOL(符号名) EXPORT_SYMBOL_GPL(符号名) **其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块。 //calculate.c #include #include MODULE_LICENSE("GPL")

daibitao的专栏 498

6.4 构网型储能的需求与配置

摘要: 构网型储能是新型电力系统的关键支撑技术,通过提供电压/频率形成、惯性和稳定控制能力,解决同步机退出导致的系统稳定性问题。其配置需遵循三大原则:1)容量配置以支撑需求为主导,兼顾能量服务;2)优先布局于电网薄弱点、稳定问题突出区域;3)采用自适应控制策略实现全工况优化。核心应用场景包括新能源送出通道稳定、负荷中心调频、黑启动电源等。规划方法需结合系统分析、量化指标和成本效益评估,实现技术经济最优。未来需重点关注构网/跟网混合系统的临界容量占比及自适应控制技术发展。

技术工作者 1140

一、两电平IGBT整流器

电压源换流器(Voltage source converter,VSC)连接交流主网和直流电网,起到交直流网络连接、功率输送和电能变换的作用。采用电压控制手段可维持直流电压的稳定;或采用功率控制手段保证系统功率输出达到预期。VSC的三相电压平衡方程如式(1)所示:式中,igx和ugx分别表示主网三相电流与电压(x=a,b,c);ucx表示换流器VSC 交流输出电压;Rg表示交流主网等效电阻;Lg表示交流主网等效电感。

TUCHACHINA的博客 4160

linux内核模块符号导出

驱动程序编译生成的 ko 文件是相互独立的,即模块之间变量或者函数在正常情况下无法进行互相访问。而一些复杂的驱动模块需要分层进行设计,这时候就需要用到内核模块符号导出。内核符号导出指的是在内核模块中导出相应的函数和变量,在加载模块时被记录在公共内核符号表中,以供其他模块调用。符号导出所使用的宏为 EXPORT_SYMBOL(sym)和 EXPORT_SYMBOL_GPL(sym)。它们定义在 “/include/linux/export.h”文件中。

123 728

【Verilog模块例化全解析:从入门到精通】

本文详细解析了Verilog模块例化的核心概念与方法。主要内容包括: 模块定义与例化的基本概念,强调模块例化会生成独立硬件电路; 两种端口连接方式:位置映射(按顺序连接)和名称映射(按端口名连接),推荐使用名称映射提高可读性; 参数化例化方法,通过parameter实现可配置模块设计; 多层模块嵌套的实战应用,展示复杂设计的层次化实现。 文章通过2位加法器等代码示例,对比分析了不同例化方式的优缺点,为硬件设计中的模块复用提供了实用指导。重点推荐名称映射和参数化设计方法,以提高代码可维护性和设计灵活性。

m0_58476824的博客 1328

记录嵌入式Linux学习(基于orangepi zero2) —— 3.内核模块符号导出实验

记录嵌入式Linux学习(基于orangepi zero2) —— 3.内核模块符号导出实验

qq_39477382的博客 231

从Low Byte解析DTC故障类型:系统开发中的诊断精细化实践

本文深入解析DTC故障诊断中Low Byte的关键作用,详细介绍了其在系统开发中的精细化应用实践。通过分析Low Byte的编码规则和故障分类设计,帮助开发者优化诊断数据库和解码方案,提升汽车电子系统的故障诊断效率和准确性。

weixin_28312391的博客 264

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 431

内核符号导出给其他模块使用的简单例子

/*   2  * 内核符号导出 给其他模块使用 使用前要申明一下   3  * 另外从 /proc/kallsyms 可以查看内核符号表的相关信息(eg.所在内存地址)   4  * eg. cat /proc/kallsyms | grep integar   5

wenhui_的专栏 909

Python实战项目2:b站评论采集

本文不对数据采集的过程做探讨,直接上代码。

lyccomcn的博客 3199

Driver:搭建linux驱动开发环境、内核驱动开发基础、导出符号、打印优先级

【什么是驱动程序】     uart_init     uart_puts     uart_gets     这就是裸板上的串口驱动     linux中将串口驱动封装了一套框架     其中实现了大量硬件无关的代码     只需要编程实现硬件相关的代码     linux下完成驱动相关的开发,需要三方面的知识:     1)硬件相关的知识         电路原理图

Hello, New World! 968

OTG原理讲解

摘要:USB OTG(On-The-Go)是USB 2.0的重要功能,允许设备在主机和从机间动态切换,实现设备间的直接通信。其核心机制是通过ID引脚电平判断角色:Micro-USB中接地为Host,悬空为Device;USB-C则通过CC引脚协商。电路设计需处理ID引脚连接和VBUS电源控制,MCU根据ID状态配置USB控制器模式。典型应用包括手机连接U盘、键盘等外设,极大扩展了移动设备的连接能力。

m0_49476241的博客 3221

逆强化学习:从专家示范中学习策略

逆强化学习(Inverse Reinforcement Learning,简称IRL)是强化学习(Reinforcement Learning,简称RL)的一个子领域,它的目标是从专家的行为中学习策略。在传统的强化学习中,智能体通过与环境交互,根据奖励信号来学习一个策略。而在逆强化学习中,我们没有直接的奖励信号,而是通过观察专家的行为来推断出奖励函数,从而学习到一个与专家类似的策略。逆强化学习作为强化学习的一个重要子领域,在许多实际应用场景中都取得了显著的成功。

AI天才研究院 1452

Linux设备驱动开发之内核模块中导出符号表

导出符号表可以让一个内核模块,调用另外一个 内核模块中的函数,它可以让linux更简约,防止 代码冗余的现象。还可以让驱动工程师写否写复杂 驱动的时候更简答。 EXPORT_SYMBOL_GPL(sym) 功能:将函数或者变量的符号表导出 参数: @sym:函数名或者变量名 编译: 1.先编译提供者模块,编译完之后会产生一个 Module.symvers,这个文件中记录的就是函 数的名字及地址 2.在编译调用者前需要将Module.symvers拷贝.

Linux_zhicheng的博客 856

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux驱动开发---导出内核符号

导出内核符号模板代码,验证小实例:   /** *Copyright (c) 2013.TianYuan *All rights reserved. * *文件名称: Esdexp.c *文件标识: 导出内核符号,此文件中的函数模块被Esdimp.c调用 * *当前版本:1.0 *作者:wuyq * *取代版本:xxx *原作者:xxx *完成日期:2013-11-1...

weixin_34023863的博客 91

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

驱动 模块 模块传参 符号导出

驱动 模块 模块传参 符号导出

weixin_57539783的博客 267

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

嵌入式linux-嵌入式内核及驱动开发,驱动模块开发,驱动代码,Makefil编写,insmod,lsmod,rmmo,模块ko参数传递,ko模块符号导出

1,驱动模块开发 驱动代码需要有四个部分 1.头文件 2.驱动模块装载和卸载函数入口声明 3.实现模块装载和卸载函数入口 4.GPL声明 1.1,创建hell.c 在Ubuntu下Samba共享文件夹中组织自己的目录结构 linux@linux:~/share$ mkdir my_driver linux@linux:~/share$ cd my_driver/ linux@li...

m0_37542524的博客 816

驱动学习(三)符号导出

内核中每个模块之间是相互独立的,也就是说A模块的全局变量和函数,B模块是无法访问的。若B模块想要使用A模块中的已有符号,那么必须将A模块中的符号做符号导出,导出到模块符号表中,然后B模块可以使用A模块导出的符号。分别创建两个驱动模块文件夹,分别编写符号导出驱动模块(export_symbols.c)和符号使用驱动模块(use_symbols.c)。在export_symbols.c中使用EXPORT_SYMBOL()宏函数和EXPORT_SYMPOL_GPL()宏函数测试导出符号。

tecoes的博客 1256

linux驱动开发(1)-内核模块

本文摘要: Linux内核模块机制允许动态扩展内核功能而无需重新编译或重启系统。内核模块以ELF格式文件存在,通过结构化的头部、节区和节区头表组成。EXPORT_SYMBOL宏实现的核心机制包含三个部分:宏定义创建符号表条目(包含函数地址和名称)、链接脚本指导链接器组织这些条目、以及运行时通过特定节区解析未定义符号。该机制通过将符号信息放置到__ksymtab等专用节区中,使内核模块能动态链接到内核导出的函数,实现模块化开发与动态加载的灵活性。

yyc的博客 1170

Linux_kernel驱动开发11

Linux内核本质上就是一个巨大的裸板程序,所有的函数都是自身实现的标准C库系统调用说明fopenopensys_open打开文件fcloseclosesys_close关闭文件freadreadsys_read读文件fwritewritesys_write写文件学习Linux内核最好的老师就是内核源码,遇到不会用的函数,去找内核源码。printk是内核中的打印函数,它输出到内核自己维护的缓冲区。

qq_45882170的博客 1648
上一篇: Java反射机制--Class类
下一篇: linux驱动开发--内核模块参数
吴英强
博客等级 码龄14年 578粉丝 373原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值