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

ISCC-Amy‘s Code CTF-Reverse

ISCC-Amy's Code CTF-Reverse

m0_72904009的博客 682

Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别

      最近在做蓝牙开发,刚接触时傻傻的分不清经典蓝牙和低功耗蓝牙的区别,一直用开发低功耗蓝牙的方法去连接经典蓝牙设备,最后当然是一直连接不上了。在此记录下经典蓝牙和低功耗蓝牙的区别和联系。 Android中的蓝牙         说到Android中的蓝牙,大家听到的可能有蓝牙1.0、蓝牙2.0、蓝牙3.0、蓝牙4.0之类的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数...

zqf_888的博客 4万+

linux内核模块符号导出

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

123 728

ADS 2023 实战:手把手教你仿真一个中心频率 2.4GHz 的带通滤波器(附工程文件)

本文详细介绍了使用ADS 2023软件设计和仿真中心频率2.4GHz带通滤波器的全流程,包括工程准备、指标定义、原理图设计、仿真优化及实际电路实现。通过切比雪夫滤波器拓扑和参数优化,实现高性能的带通滤波器设计,适用于无线通信系统。附有工程文件和常见问题解决方案,助力工程师快速掌握射频滤波器设计技巧。

weixin_30790841的博客 482

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

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

qq_39477382的博客 231

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

480

告别QXDM:在Android Studio中调试与验证高通NV读写功能的完整流程

本文详细介绍了在Android Studio中调试与验证高通NV分区读写功能的完整流程,替代传统的QXDM工具。通过JNI接口层、HAL服务层和Diag通信层的架构设计,开发者可以在熟悉的IDE环境中高效完成NV操作,包括环境配置、错误处理和性能优化等关键实践。

weixin_27013291的博客 261

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

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

wenhui_的专栏 909

华为昇腾910B3显卡实战:手把手教你部署DeepSeek 32B模型(含Bge-zh向量库配置)

本文详细介绍了在配备8张华为昇腾910B3显卡的服务器上,从零部署DeepSeek 32B大模型推理服务的完整实战方案。内容涵盖环境准备、模型配置、多卡负载分配,并集成了BGE中文向量模型与ChromaDB向量数据库,最终通过Open WebUI构建了可投入生产的企业级AI应用栈,为私有化大模型部署提供了具体参考。

weixin_29038345的博客 1709

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

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

Hello, New World! 968

PS射击游戏射线检测优化:原理、工程与全链路高性能实现

射线池:减少GC,提升批量检测效率。分层检测:先粗后细,远距离射击高效判定。批量检测:并行处理,适合大量射线场景。空间结构:进一步加速大场景检测。下面继续深入射线检测优化,补充更多实用细节和进阶技巧,包括空间分区加速、射线检测多线程/异步化、射线合并与分帧、射线池通用模板、常见性能陷阱与调优建议等。对于极端性能需求,可自定义轻量级物理系统,仅检测关键对象(如玩家、子弹),跳过复杂物理引擎。结合AABB、OBB、球体等简单碰撞体,射线-包围体检测极快。空间分区+分层检测是大场景射线优化核心。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 434

Qt —— 在Win11下“Qt for Android“开发环境,通过USB在真机(华为Meta60 PRO)上调试运行,并打包APK并在真实手机运行

Qt —— 在Win11下“Qt for Android“开发环境,打包APK并在真实手机运行

314

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

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

Linux_zhicheng的博客 856

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_34023863的博客 91

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

weixin_57539783的博客 267

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

嵌入式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、付费专栏及课程。

余额充值