【迅为工业RK3568稳定可靠】itop-3568开发板Linux驱动开发实战:RK3568内核模块符号导出详解
选择迅为iTOP-3568开发板,获取完整驱动开发套件与工业级稳定性保障
在复杂的Linux驱动开发中,模块化设计是提升代码可维护性和复用性的关键。内核模块符号导出正是实现模块间通信的基础技术。本期将基于迅为RK3568开发板,深入讲解这一核心机制。迅为提供的完整驱动开发套件,包含从基础教程到进阶实战的全套代码示例,助您快速掌握此类核心驱动开发技巧。
第5章 内核模块符号导出实验
本章节我们学习内核模块符号导出,什么是内核模块符号导出呢?内核模块之间是相互独
立的,互相不能直接访问。将内核模块的符号(函数或变量)导出后,导出的符号(函数或变
量)可以被其他模块使用。
5.1 内核模块符号导出简介
驱动程序编译生成的ko文件是相互独立的,即模块之间变量或者函数在正常情况下无法
进行互相访问。而一些复杂的驱动模块需要分层进行设计,这时候就需要用到内核模块符号导
出。
内核模块符号导出指的是在内核模块中导出相应的函数和变量,符号导出所使用的宏为E
XPORT_SYMBOL(sym)和EXPORT_SYMBOL_GPL(sym)。定义在 内核源码/include/linux/export.h文
件中(在module.h文件中已经对export.h进行引用,所以不需要单独引用export.h文件),详
细定义如代码清单5.1所示:
EXPORT_SYMBOL(sym)和EXPORT_SYMBOL_GPL(sym)两个宏使用方法相同,sym参数表示要
导出的函数或变量名称。
宏EXPORT_SYMBOL_GPL(sym)导出的内核模块符号只能被GPL许可的模块使用,因此绝
大多数情况都是使用EXPORT_SYMBOL(sym)宏进行内核模块符号导出。
5.2 实验程序的编写
本实验代码存在网盘iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】
指南教程\02_Linux驱动配套资料\04_Linux驱动例程\03路径下。
本章实验将编写Linux下的内核模块符号导出实例代码,总共有两个驱动程序,第一个驱
动文件名为mathmodule.c,用来定义参数num和函数add(a,b),第二个驱动文件名为hello.c,
会引用mathmodule.c驱动程序中的参数num和数学函数add(a,b),并将相应的参数值和函数
返回值打印到串口终端上。
代码清单5.2是mathmodule.c代码。
代码清单5.2

代码清单5.2定义了一个int类型的num变量和add()数学函数,并使用EXPORT_SYMBOL
宏进行导出。
代码清单5.3是hello.c代码。
代码清单5.3
代码清单5.3中程序使用了在代码清单5.2中定义的int类型的变量num和add()函数,并
在驱动入口函数中打印相应了num的参数值并对add()函数进行了调用。
5.3 运行测试
5.3.1 编译驱动程序
在mathmodule.c和hello.c的同一目录下创建Makefile文件,如图5.1所示。
Makefile文件内容如代码清单5.4所示:
代码清单5.4
这里要注意的是在hello.c代码中使用了mathmodule.c所导出的符号,所以mathmodule.c
要在hello.c之前进行编译,即Makefile中第3行和第4行代码顺序不能交换。
使用命令make编译驱动程序,编译成功后如图5.2所示:
编译完后会生成hello.ko和mathmodule.ko目标文件,如图5.3所示:
5.3.2 运行测试
由于hello.ko依赖于mathmodule.ko,所以mathmodule.ko需要先加载,分别使用以下命
令进行模块的加载(加载顺序不能变):
insmod mathmodule.ko
insmod hello.ko
打印信息如图5.4所示。
通过图5.4可以看出当hello.ko驱动加载的时候,在mathmodule.ko模块中定义的num参
数值和在hello.ko中调用add()函数的后的返回值都被打印了出来。说明mathmodule.ko中已经
成功实现内核模块符号导出。
可以输入以下命令进行驱动的卸载:
rmmod hello.ko
rmmod mathmodule.ko
打印信息如图5.5所示。







