第4章 内核模块实验(iTOP-RK3568开发板驱动开发指南 )

news2025/2/24 14:14:52

在上一章节我们编写了最简单的helloworld驱动程序。有了驱动程序以后,要如何编译并使用驱动呢。编译驱动有俩种方法,分别是将驱动编译成内核和将驱动编译成内核模块。我们先来学习如何将驱动编译成内核模块、

4.1 设置交叉编译器

1 下载网盘资料下的交叉编译器,网盘路径为:“XXX”,将下载的交叉编译器拷贝到Ubuntu的/usr/local目录下,如下图(图4-1)所示:

img

图 4-1

2 输入以下命令,解压交叉编译编译器压缩包,解压完毕会生成“gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu”文件夹,这是实验需要的交叉编译工具,如下图(图4-2)所示:

tar -vxf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz

img

图 4-2

3 在终端输入“sudo vi /etc/profile”命令,在文件最后输入以下命令修改环境变量。

export PATH=$PATH:/usr/local/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin

img

图 4-3

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

img

图 4-4

4.2 编写Makefile

编译驱动程序还需要使用Makefile文件。我们为helloworld.c编写一个简单的Makefile,Makefile文件和源文件helloworld.c位于同一级目录,代码如下(图4-5)所示:

export ARCH=arm64  
export CROSS_COMPILE=aarch64-linux-gnu-  
obj-m += helloworld.o    #helloworld.c对应.o文件的名称。名称要保持一致。
KDIR :=/home/topeet/Linux/linux_sdk/kernel    #内核源码所在虚拟机ubuntu的实际路径
PWD ?= $(shell pwd)
all:
    make -C $(KDIR) M=$(PWD) modules    #make操作
clean:
    make -C $(KDIR) M=$(PWD) clean    #make clean操作

图 4-5

代码解释如下:

  • 第1行设置ARCH变量为arm64
  • 第2行设置交叉编译器前缀为aarch64-linux-gnu-
  • 第3行obj-m += <文件>:将指定的文件(需要是以.o结尾)设为编译时以模块形式编译
  • 第4行是设备树内核的源码路径,请大家根据实际内核路径进行修改。
  • 第5行是获取当前目录的变量
  • 第7行是编译make操作,会进入内核源码的路径,然后把当前路径下的代码编译成模块。
  • 第9行是清除编译文件

编写完成如下图(图4-6)所示:

img

图 4-6

4.3 编译模块

有了Makefile以后,输入“make”命令就可以编译helloworld驱动模块,如下图(图4-7)所示:

img

图 4-7

编译完生成helloworld.ko目标文件就是我们需要的内核模块。内核模块是以ko为后缀名,如下图(图4-8)所示:

img

图 4-8

输入“make clean”命令清除编译文件,如下图(图4-9)所示:

img

图 4-9

4.4 模块加载与卸载

有了内核模块以后,我们要如何使用呢?编译驱动有俩种方式,那Linux驱动的运行方式也肯定有俩种。一种就是将驱动编译进内核,这样Linux系统启动后会自动运行程序。第二种就是将驱动编译成模块,在Linux系统启动以后使用“insmod”命令加载驱动模块。

在上个小节中编译了驱动模块helloworld.ko,在RK3568开发板上通过“insmod helloworld.ko”命令可以加载驱动,在加载驱动模块的时候会执行驱动入口的函数,也就是helloworld程序中的helloworld_init函数,所以可以看到打印出来的字符串信息“helloworld_init”。如下图(图4-10)所示:
img

图 4-10

如果要卸载helloworld内核模块,可以通过“rmmod helloworld”命令来卸载驱动模块,同理在卸载驱动模块的时候会执行驱动出口的函数,所以可以看到驱动出口函数打印出来的字符串信息“helloworld_exit”,如下图(图4-11)所示:

img

图 4-11

加载驱动模块也可以使用modprobe命令,它比insmod命令更强大,modprobe命令在加载驱动模块的时候,会同时加载该模块依赖的其他模块。比如helloworld.ko依赖before.ko,使用insmod加载的时候,就必须先加载before.ko,然后在加载helloworld.ko才可以加载成功从。但是使用modprobe加载的时候,他会自动分析模块的依赖关系,然后将所有的依赖的模块都加载到内核当中。比较“聪明”。

同样,在卸载驱动模块的时候,如果模块存在依赖关系,如果使用insmod命令,需要手动卸载依赖的内核模块,但是使用modprobe命令可以自动卸载驱动模块所依赖的其他模块。

所以,如果驱动模块是以“modprobe helloworld.ko”命令加载的,卸载的时候使用“modprobe -r helloworld.ko”命令卸载。

但是使用modprobe卸载存在一个问题,如果所依赖的模块被其他模块所使用,比如刚才例子中的before.ko还被其他的模块使用,这时候就不能使用modprobe卸载。所以还是推荐使用rmmod命令来卸载。

4.5查看模块信息

在驱动模块加载之后,使用“modinfo helloworld.ko”命令可以获得模块的信息,包括模块作者,模块说明,模块支持的参数等等。

lsmod 命令可以列出已经载入Linux内核模块,在helloworld驱动加载之后,查看内核中加载的模块,如下(图4-12)所示:

img

图 4-12

【最新驱动资料(文档+例程)】

链接 https://pan.baidu.com/s/1M4smUG2vw_hnn0Hye-tkog

提取码:hbh6

【B 站配套视频】

https://b23.tv/XqYa6Hm

【RK3568 购买链接】

https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-2245

e-tkog

提取码:hbh6

【B 站配套视频】

https://b23.tv/XqYa6Hm

【RK3568 购买链接】

https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-2245

2452613.11.2fec74a6elWNeA&id=669939423234

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/982396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年9月软考高级信息系统项目管理师认证报名找弘博创新

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

更改注册表exe值后的惨痛经历

装软件时由于执行性文件打不开&#xff0c;搜索教程更改了exefile的值&#xff0c;最后整个电脑崩了&#xff0c;所有EXE都打不开&#xff0c;折腾了5个小时&#xff0c;什么办法都试了&#xff0c;甚至重置电脑都不让&#xff0c;打算拿电脑城修电脑了&#xff0c;突然搜到了一…

文件上传之图片马混淆绕过与条件竞争

一、图片马混淆绕过 1.上传gif imagecreatefromxxxx函数把图片内容打散&#xff0c;&#xff0c;但是不会影响图片正常显示 $is_upload false; $msg null; if (isset($_POST[submit])){// 获得上传文件的基本信息&#xff0c;文件名&#xff0c;类型&#xff0c;大小&…

C++ continue 语句

C 中的 continue 语句有点像 break 语句。但它不是强迫终止&#xff0c;continue 会跳过当前循环中的代码&#xff0c;强迫开始下一次循环。 对于 for 循环&#xff0c;continue 语句会导致执行条件测试和循环增量部分。对于 while 和 do…while 循环&#xff0c;continue 语句…

MySQL聚簇索引与非聚簇索引

分析&回答 当数据库一条记录里包含多个字段时&#xff0c;一棵B树就只能存储主键&#xff0c;如果检索的是非主键字段&#xff0c;则主键索引失去作用&#xff0c;变成顺序查找了。这时应该在第二个要检索的列上建立第二套索引。这个索引由独立的B树来组织。有两种常见的方…

Redis优化 RDB AOF持久化

---------------------- Redis 高可用 ---------------------------------------- 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境…

图文版:以太网二层接口类型(含配套习题)

常见的以太网二层接口类型包括以下三种&#xff1a; 一、Access接口 access链路类型端口&#xff0c;一种交换机的主干道模式&#xff0c;2台交换机的2个端口之间是否能够建立干道连接&#xff0c;取决于这2个端口模式的组合。 Access端口在收到以太网帧后打开VLAN标签&#…

祝贺埃文科技入选河南省工业企业数据安全技术支撑单位

近日&#xff0c;河南省工业信息安全产业发展联盟公布了河南省工业信息安全应急服务支撑单位和河南省工业企业数据安全技术支撑单位遴选结果,最终评选出19家单位作为第一届河南省工业信息安全应急服务支撑单位和河南省工业企业数据安全技术支撑单位。 埃文科技凭借自身技术优势…

网络课程学习

计算机网络概述 计算机网络定义 一组自治计算机互联的集合 计算机网络基本功能 资源共享 综合信息服务 分布式处理与负载均衡 计算机网络的类型 局域网 LAN&#xff1a;由用户自行建设&#xff0c;使用私有地址组建的内部网络 城域网 MAN&#xff1a;由运营商或大规模…

得心应手应对 OOM 的疑难杂症

Java全能学习面试指南&#xff1a;https://www.javaxiaobear.cn/ 前面我们提到&#xff0c;类的初始化发生在类加载阶段&#xff0c;那对象都有哪些创建方式呢&#xff1f;除了我们常用的 new&#xff0c;还有下面这些方式&#xff1a; 使用 Class 的 newInstance 方法。使用…

ssprompt:一个LLM Prompt分发管理工具

阅读顺序 &#x1f31f;前言&#x1f514;ssprompt介绍命令介绍Metafile介绍版本依赖规则 &#x1f30a; PromptHubGitHub Token &#x1f680; Quick Install系统依赖pip安装Linux, macOS, Windows (WSL)Windows (Powershell) &#x1f6a9; Roadmap&#x1f30f; 项目交流讨论…

智汇云舟出席全球制造业峰会并作主题分享

9月1日-5日&#xff0c;由中华人民共和国商务部、中华人民共和国国家发展和改革委员会、中华人民共和国科学技术部、中国国际贸易促进委员会、辽宁省人民政府共同主办的全球制造业峰会暨第二十一届中国&#xff08;沈阳&#xff09;国际装备制造业博览会在沈阳国际会展中心召开…

身份证二要素核验-实名认证API:数据隐私的守护先锋

前言 在当今数字化世界中&#xff0c;数据隐私和安全问题变得尤为重要。随着互联网的普及&#xff0c;个人信息的泄露已经成为潜在的威胁。为了应对这一挑战&#xff0c;身份证二要素核验-实名认证API成为了数据隐私的守护先锋&#xff0c;提供了一种强大的工具来确保个人信息…

前端面试的话术集锦第 8 篇:高频考点(JS性能优化 性能优化琐碎事)

这是记录前端面试的话术集锦第八篇博文——高频考点(JS性能优化 & 性能优化琐碎事),我会不断更新该博文。❗❗❗ 1. 从V8中看JS性能优化 注意:该知识点属于性能优化领域。 1.1 测试性能⼯具 Chrome已经提供了⼀个⼤⽽全的性能测试⼯具Audits。 点我们点击Audits后,可…

分享一个基于SpringBoot+Vue的招生宣传管理系统源码 招生计划管理系统代码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

day-07 I/O 复用(select)- 多种 I/O 函数 - 多播和广播

一.I/O复用 &#xff08;一&#xff09;基于I/O复用的服务器端 1.多进程服务器 每次服务都需要创建一个进程&#xff0c;需要大量的运算和内存空间 2.复用 只需创建一个进程。 3.复用技术在服务器端的应用 &#xff08;二&#xff09;select函数实现服务器端 &#xff08;…

二维码智慧门牌管理系统:让城市管理更智能、便捷

文章目录 前言一、二维码智慧门牌管理系统的特点二、数据集约化与规范化三、管理智能化与长效化四、标识规范化与易维护五、服务多元化与便捷化 前言 随着城市化进程的加速&#xff0c;城市管理面临着越来越多的挑战。为了解决地名地址管理交织错综、地名地址支撑政府管理成效…

华为云云服务器评测| 之兼容性测试

文章目录 前言创建文本文件编写脚本赋予脚本执行权限及脚本运行结果解析结果说明 : 总结 前言 兼容性测试作为软件开发和系统维护中的关键环节&#xff0c;对于确保系统的可靠性和稳定性至关重要。随着云计算的兴起&#xff0c;越来越多的企业选择将应用程序和服务迁移到云平台…

集合结构体系

集合体系结构 collection单链集合&#xff1a;是单列集合的祖宗接口&#xff0c;他的功能是所有单列集合可以继承使用的 创建collection对象 Collection<String> collnew ArrayList<>();//学习阶段才创建的collection中的arraylist方法名称说明boolean add()集合中…

Unity 之预制体(Prefab)的解释以及用法

文章目录 详细解释代码举例 详细解释 Unity中的预制体&#xff08;Prefab&#xff09;是一种重要的资源类型&#xff0c;用于创建和管理游戏对象&#xff08;GameObject&#xff09;。预制体是一种可重用的模板&#xff0c;可以在游戏场景中多次实例化&#xff0c;使开发人员能…