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

描述

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

 

 

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

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

 


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

 

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 所示:

RK3568

 

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

RK3568

 

RK3568

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

宏进行导出。 

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

代码清单 5.3

RK3568

 

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

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

5.3 运行测试 

5.3.1 编译驱动程序 

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

RK3568

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

代码清单 5.4

RK3568

 

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

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

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

 

RK3568

 

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

RK3568

 

5.3.2 运行测试 

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

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

insmod mathmodule.ko 

insmod hello.ko 

打印信息如图 5.4 所示。

RK3568

 

 

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

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

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

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

rmmod hello.ko 

rmmod mathmodule.ko 

打印信息如图 5.5 所示。

RK3568

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分