作为一名嵌入式Linux的初学者,在拿到功能强大的RK3568开发板时,我的心情既兴奋又忐忑。兴奋在于终于可以动手实践,忐忑则源于对复杂开发环境的恐惧。网络上零散的资料、版本不匹配的工具链、以及深不见底的“坑”,都巨大挑战。
然而,迅为提供的一站式资料包,可以让嵌入式Linux学习之旅却出乎意料地顺畅和高效。本文将分享《【北京迅为】itop-3568开发板驱动开发指南》第3章 内核模块实验的完整过程。
迅为一站式学习教程资料包的价值所在
,迅为的一站式资料包在以下几个方面让我效率翻倍:
1.完整性:从工具链、源码、到文档和工具,所有要素版本匹配,开箱即用,形成了闭环生态。
2.指引性:步步为营的文档如同一位无声的导师,消除了过程中的不确定性,让学习路径清晰可见。
3.排障效率:技术支持是强大的“安全网”,能将绝大多数常见问题的解决,
对于一名新手而言,时间是最宝贵的成本。迅为的资料包所做的,正是通过体系化的知识工程,最大限度地节约的时间,保护了学习热情,能够快速进入嵌入式Linux开发的核心殿堂——驱动开发。这无疑是一次价值远超硬件本身的投资。

北京迅为RK3568开发板:迅为RK3568开发板ARM3568J核心板瑞芯微人工智能AI鸿蒙Linux安卓
联系我们获得《迅为itop-3568开发板驱动开发指南》完整版本。
配套视频资源:【北京迅为】嵌入式学习之Linux驱动, 免费在线观看
【北京迅为itop-3568开发板驱动开发指南第 3 章 内核模块实验】
在上一章节编写了最简单的驱动程序helloworld。helloworld驱动程序要如何编译并运行
呢?编译驱动有两种方法,分别是将驱动编译进内核和将驱动编译成内核模块。我们先来学习
如何将驱动编译成内核模块。
把驱动编译成内核模块并运行需要设置交叉编译器、编写Makefile和编译模块三个步骤。
编译好的内核模块可以使用insmod命令加载到内核运行,从内核中卸载内核模块使用rmmod
命令。
3.1 设置交叉编译器
1.下载交叉编译器
在网盘“iTOP-3568开发板\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\03_
交叉编译器”路径下下载交叉编译器,将下载好的交叉编译器拷贝到虚拟机Ubuntu环境中的
/usr/local目录下,如图3.1所示。

输入tar -vxf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz命令解压交叉编译压缩
包,解压完毕后会生成交叉编译器所在的文件夹。如图3.2所示。

2.设置环境变量
在终端输入sudo vi /etc/profile命令打开profile文件,接着在profile文件末尾添加以下
代码。
export PATH=$PATH:/usr/local/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
添加完后如图3.3所示。

保存退出后在终端输入reboot命令重新启动Ubuntu系统,使交叉编译环境生效。
3.检查是否设置成功
Ubuntu系统重新启动登录到系统后,打开命令行终端,输入命令aarch64-linux-gnu-gcc -v,
如果终端有如图3.4所示的打印信息,说明交叉编译环境搭建成功。如果没有出现如图3.4的
打印信息,需要检查上一步骤是否设置正确。

3.2 编写 Makefile

编译驱动程序需要使用Makefile文件。接下来为helloworld.c编写一个简单的Makefile,其
代码如代码清单3.1所示。

源文件helloworld.c与Makefile文件需要位于同一级目录下。如下图3.5所示:

3.3 编译成内核模块
在把驱动编译成内核模块之前需先编译通过在Makefile文件中通过KDIR变量指定路径下
的内核源码。内核源码编译通过后,在Makefile与helloworld驱动路径下输入make命令即可
把helloworld驱动编译成内核模块,如图3.6所示。

内核模块是以ko为后缀名,因此编译成功得到的helloworld.ko文件即内核模块,也就是
编译好的驱动程序。如图3.7所示:

输入make clean命令可清除编译文件,如图3.8所示:

3.4 模块加载与卸载
内核模块可以通过insmod命令加载、通过rmmod命令卸载。
将helloworld.ko内核模块拷贝到iTOP-RK3568开发板上,通过insmod helloworld.ko命令加
载helloworld内核模块,加载内核模块时会调用驱动入口函数helloworld_init,从而输出打印
字符串信息“helloworld_init”,如图3.9所示:

如果要卸载helloworld内核模块,执行rmmod helloworld命令。同理,在卸载内核模块的
时候会执行驱动出口函数,所以可以看到驱动出口函数打印出来的字符串信息helloworld_exit,
如下3.10所示:

加载内核模块也可以使用modprobe命令,它比insmod命令更强大,modprobe命令在加
载驱动模块的时候,会同时加载该模块依赖的其他模块。比如helloworld.ko依赖before.ko,
使用insmod加载的时候,就必须先加载before.ko,然后再加载helloworld.ko才可以加载成功。
使用modprobe加载的时候,他会自动分析模块的依赖关系,然后将所有依赖的模块都加载到
内核当中,所以modprobe命令比较“聪明”。
同样,在卸载驱动模块的时候,如果模块存在依赖关系,如果使用insmod命令,需要手
动卸载依赖的内核模块,但是使用modprobe命令可以自动卸载驱动模块所依赖的其他模块。
如果驱动模块是以modprobe helloworld.ko命令加载的,卸载的时候使用modprobe -r
helloworld.ko命令卸载。
但是,使用modprobe卸载存在一个问题,如果所依赖的模块被其他模块所使用,比如刚
才例子中的before.ko还被其他的模块使用,这时候就不能使用modprobe卸载。所以要根据
需求选择合适的命令进行操作。
3.5 查看模块信息
lsmod命令可以列出已经载入Linux内核模块,在helloworld驱动加载之后,使用lsmod
命令查看内核中加载的模块,如图3.11所示:

除了使用lsmod命令,也可以使用modinfo helloworld.ko命令可以获得模块的其他信息,
如模块作者,模块说明,模块支持的参数等等。
-
开发板
+关注
关注
26文章
6422浏览量
120917 -
驱动开发
+关注
关注
0文章
142浏览量
12720 -
Linux驱动
+关注
关注
0文章
47浏览量
10523
发布评论请先 登录
【迅为iTOP-Hi3403开发板】一站式启动Hi3403 NPU开发:从运行例程开始,快速验证AI效能
迅为3568开发板从零学习Linux驱动开发:迅为一站式资料包如何让我效率翻倍
评论