嵌入式
返回首页

迅为工业RK3568 itop-3568开发板Linux驱动开发实战:RK3568内核模块符号导出详解

2025-12-04 来源:elecfans

迅为工业级稳定可靠的RK3568平台itop-3568开发板驱动开发实战:RK3568内核模块符号导出深入解析

选择迅为iTOP-3568开发板,获取完整驱动开发套件与工业级稳定性保障

在复杂的Linux驱动开发中,模块化设计是提升代码可维护性和复用性的关键。内核模块符号导出正是实现模块间的基础技术。本期将基于迅为RK3568开发板,深入讲解这一核心机制。


迅为提供的完整驱动开发套件,包含从基础教程到进阶实战的全套代码示例,助您快速掌握此类核心驱动开发技巧。

wKgZPGkf92yAW_cSAAPQZuGAs7k384.png

第5章 内核模块符号导出实验

本章节我们学习内核模块符号导出,什么是内核模块符号导出呢?内核模块之间是相互独

立的,互相不能直接访问。将内核模块的符号(函数或变量)导出后,导出的符号(函数或变

量)可以被其他模块使用。

5.1 内核模块符号导出简介

驱动程序编译生成的ko文件是相互独立的,即模块之间变量或者函数在正常情况下无法

进行互相访问。而一些复杂的驱动模块需要分层进行设计,这时候就需要用到内核模块符号导

出。

内核模块符号导出指的是在内核模块中导出相应的函数和变量,符号导出所使用的宏为E

XPORT_SYMBOL(sym)和EXPORT_SYMBOL_GPL(sym)。定义在 内核源码/include/linux/export.h文

件中(在module.h文件中已经对export.h进行引用,所以不需要单独引用export.h文件),详

细定义如代码清单5.1所示:wKgZPGkf9maAWWlHAABA-1l5IJY098.png

EXPORT_SYMBOL(sym)和EXPORT_SYMBOL_GPL(sym)两个宏使用方法相同,sym参数表示要

导出的函数或变量名称。

宏EXPORT_SYMBOL_GPL(sym)导出的内核模块符号只能被GPL许可的模块使用,因此绝

大多数情况都是使用EXPORT_SYMBOL(sym)宏进行内核模块符号导出。

5.2 实验程序的编写

本实验代码存在网盘iTOP-RK3568开发板【底板V1.7版本】3_【iTOP-RK3568开发板】

指南教程2_Linux驱动配套资料4_Linux驱动例程3路径下

本章实验将编写Linux下的内核模块符号导出实例代码,总共有两个驱动程序,第一个驱

动文件名为mathmodule.c,用来定义参数num和函数d(a,b),第二个驱动文件名为hello.c,

会引用mathmodule.c驱动程序中的参数num和数学函数add(a,b),并将相应的参数值和函数

返回值打印到串口终端上。

代码清单5.2是mathmodule.c代码。

代码清单5.2wKgZPGkf9maAYL_mAAD8rlFsgDY629.png

wKgZO2kf9maAaPpYAAA6jkawQAY512.png

代码清单5.2定义了一个int类型的num变量和add()数学函数,并使用EXPORT_SYMBOL

宏进行导出。

代码清单5.3是hello.c代码。

代码清单5.3wKgZO2kf9maAAUHgAAEnZPouQwQ094.png

代码清单5.3中程序使用了在代码清单5.2中定义的int类型的变量num和add()函数,并

在驱动入口函数中打印相应了num的参数值并对add()函数进行了调用。

5.3 运行测试

5.3.1 编译驱动程序

在mathmodule.c和hello.c的同一目录下创建Makefile文件,如图5.1所示。wKgZPGkf9maAMIlSAABc4uGvaxc021.png

Makefile文件内容如代码清单5.4所示:

代码清单5.4wKgZO2kf9maAZJldAACW7q8baWU127.png

这里要注意的是在hello.c代码中使用了mathmodule.c所导出的符号,所以mathmodule.c

要在hello.c之前进行编译,即Makefile中第3行和第4行代码顺序不能交换

使用命令make编译驱动程序,编译成功后如图5.2所示:

wKgZPGkf9maAFxbWAAG08ePQPbc294.png

编译完后会生成hello.ko和mathmodule.ko目标文件,如图5.3所示:wKgZO2kf9maALBhlAAFE3n5L2DY695.png

5.3.2 运行测试

由于hello.ko依赖于mathmodule.ko,所以mathmodule.ko需要先加载,分别使用以下命

令进行模块的加载(加载顺序不能变):

insmod mathmodule.ko

insmod hello.ko

打印信息如图5.4所示。wKgZO2kf9maAF0VfAAC50QlAjjY226.png

通过图5.4可以看出当hello.ko驱动加载的时候,在mathmodule.ko模块中定义的num参

数值和在hello.ko中调用add()函数的后的返回值都被打印了出来。说明mathmodule.ko中已经

成功实现内核模块符号导出。

可以输入以下命令进行驱动的卸载:

rmmod hello.ko

rmmod mathmodule.ko

打印信息如图5.5所示。wKgZPGkf9maAP36nAAB-qdQZnf0052.png

进入嵌入式查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • FollowMe 第二季:3 - EK_RA6M5 开发板入门

  • FollowMe 第二季: 1 Adafruit Circuit Playground Express及任务讲解

  • Azure RTOS step by step workshop

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • 从0到1:树莓派与物联网教程(英文)

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章