字符设备驱动的加载与卸载

news2024/12/23 6:19:47

一. 简介

前面几篇文章编写了 字符设备驱动模块加载与卸载框架代码,设置了开发板启动方式。文章地址如下:

字符设备驱动框架的编写-CSDN博客

字符设备驱动模块的编译-CSDN博客

字符设备驱动的加载与卸载前工作-CSDN博客

本文学习如何加载与卸载驱动模块。

二.  字符设备驱动的加载与卸载

上一篇文章做了字符驱动模块加载前的工作。具体工作为:

开发板设置为 从 SD卡启动,即 SD卡内烧写了uboot,开发板 从 SD卡中启动 uboot。

通过 tftp服务从 ubuntu系统下加载 内核镜像 zImage与 .dtb设备树文件,通过 nfs服务从 ubuntu系统下加载 根文件系统 rootfs。

1.  加载字符设备驱动模块

前面一篇文章编写了初步的字符设备驱动框架,最后,编译出了 .ko 文件,这里将编译出来的驱动文件即 .ko文件放到根文件系统 rootfs 中。

(1)   加载模块命令

加载模块命令有两种:insmod 命令和 modprobe 命令

insmod 命令

insmod 命令不能解决模块的依赖关系,比如 drv.ko 依赖 first.ko 这个模块,就必须先使用 insmod 命令加载 first.ko 这个模块,然后再加载 drv.ko 这个模块。

modprobe 命令

modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,因此,modprobe 命令相比 insmod 要智能一些。 modprobe 命令主要智能在提供了模块的依赖性分析、错误检查、错误报告等功能,推荐使用 modprobe 命令来加载驱动。
modprobe 命令默认会去  /lib/modules/<kernel-version> 目录中查找模块,例如,本书使用的 Linux kernel 的版本号为 4.1.15 所以, modprobe 命令默认会到 /lib/modules/4.1.15 这个目录中查找相应的驱动模块,一般自己制 作的根文件系统中是不会有这个目录的,所以需要自己手动创建。

(2)  加载模块

①  创建 /lib/modules/4.1.15目录

开发板上电启动后,进入根文件系统下首先,在开发板的根文件系统下创建 /lib/modules 目录:

/ # ls
bin             hello.c         proc            sys
dev             lib             root            tmp
etc             linuxrc         rootfs.tar.bz2  usr
hello           mnt             sbin            中文测试
/ # cd lib/
/lib # mkdir modules
/ #

进入 /lib/modules 目录下,再运行 modprobe命令:

以上提示可以看出,还需要再  /lib/modules目录下,创建目录 /4.1.15目录:

/lib/modules # mkdir 4.1.15

进入 /lib/modules 目录下,再运行 modprobe命令:

可以看出,这时运行 modprobe命令,已经没有任何提示了。

②  加载 字符驱动模块即 .ko文件

将前面一篇文章编译的 字符驱动模块(即 .ko文件) 存放到 开发板根文件系统下 /lib/modules/4.1.15目录下。进入 ubuntu系统下,进入 1_chrdevbase工程目录下:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/1_chrdevbase$ sudo cp chrdevbase.ko /home/wangtian/linux/nfs_File/rootfs/lib/modules/4.1.15/ -f
[sudo] wangtian 的密码: 
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/1_chrdevbase$

在开发板根文件系统 /lib/modules/4.1.15目录下可以查看到 .ko文件。加载 chrdevbase.ko 驱动文件:

以上提示无法打开“modules.dep”这个文件。我们不用手动创建 modules.dep 这个文件,直接输入 depmod 命令即可自动生成 modules.dep,有些根文件系统可能没有 depmod 这个命令,如果没有这个命令就只能重新配置 busybox,使能此命令,然后重新编译 busybox

注意:对于一个新的模块使用modprobe命令加载,加载时需要先调用一下depmod命令!!!

输入“depmod” 命令来解决:

运行 modprobe命令加载  驱动模块:

/lib/modules/4.1.15 # modprobe chrdevbase.ko 
chrdevbase: module license 'unspecified' taints kernel.
Disabling lock debugging due to kernel taint

可以看出,加载驱动模块时,提示模块 Licence 会影响到 内核。Linux驱动源码一般需要加入 Licence信息的,而 1_chrdevbase驱动源码中没有加入 Licence信息。

2.  lsmod 命令查看 已加载的模块驱动

lsmod” 命令即可查看当前系统中存在的模块。查看所加载的驱动模块:

/lib/modules/4.1.15 # lsmod
Module                  Size  Used by    Tainted: P  
chrdevbase               586  0 
/lib/modules/4.1.15 # 

3. 卸载字符设备驱动模块

驱动模块的卸载使用 “rmmod” 命令,卸载模块驱动操作如下:
/lib/modules/4.1.15 # rmmod chrdevbase.ko 

查看 .ko 模块驱动是否还存在:

/lib/modules/4.1.15 # lsmod
Module                  Size  Used by    Tainted: P  
/lib/modules/4.1.15 # 

可以看出,驱动模块已经不存在,说明驱动模块已经成功卸载了。

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

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

相关文章

windows10 固定电脑IP地址操作说明

windows10 固定电脑IP地址操作说明 一、无线网络的IP地址设置方法二、有线网络的IP地址设置方法 本文主要介绍&#xff0c;windows10操作系统下&#xff0c;不同的网络类型&#xff0c;对应的电脑IP地址设置方法。 一、无线网络的IP地址设置方法 在桌面右下角&#xff0c;点击…

st.pp.normalize_total(data) # NOTE: no log1p

这段代码在使用 stlearn 包中的 st.pp.normalize_total 函数对数据进行总体计数标准化。标准化后&#xff0c;每个细胞的总计数都将等于 median(total_counts)。 NOTE: no log1p 这行注释表示在标准化后&#xff0c;数据不会进行 log1p 转换。log1p 转换将每个计数值增加 1&a…

Java如何创建线程?到底有几种方式创建线程?

文章目录 继承Thread类实现Runnable接口实现Callable接口匿名内部类形式的线程创建实现接口 VS 继承Thread到底有几种创建线程的方式&#xff1f;参考 继承Thread类 定义一个线程类&#xff0c;重写实现run方法(因为 Thread类也实现了 Runable接口)&#xff0c;在其中定义线程…

Pytorch神经网络的参数管理

目录 一、参数访问 1、目标参数 2、一次性访问所有参数 3、从嵌套块收集参数 二、参数初始化 1、内置初始化 2、自定义初始化 3、参数绑定 在选择了架构并设置了超参数后&#xff0c;我们就进入了训练阶段。此时&#xff0c;我们的目标是找到使损失函数最小化的模型参数…

矩阵式键盘实现的电子密码锁

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit P14P1^4; //将P14位定义为P1.4引脚 sbit P15P1^5; //将P15位定义为P1.5引脚 sbit P16P1^6; //将P16位定义为P1.6引脚 sbit P17P1^7; //将P17位定义为P1.7引脚 sbit soundP3^7; //将so…

新媒体宣传与广州迅腾文化传播有限公司:品牌知名度提升的新动力

新媒体宣传与广州迅腾文化传播有限公司&#xff1a;品牌知名度提升的新动力 随着科技的飞速发展和互联网的普及&#xff0c;新媒体已经成为现代社会不可或缺的一部分。新媒体平台具有传播速度快、覆盖面广的特点&#xff0c;为企业品牌宣传提供了前所未有的机会。广州迅腾文化…

黑马点评07 秒杀优化 加阻塞队列

实战篇-22.秒杀优化-异步秒杀思路_哔哩哔哩_bilibili 1.流程回顾 1.1超卖问题 判断秒杀时间&#xff0c;加乐观锁&#xff08;比较标记/版本&#xff09;&#xff0c;检查库存是否大于0 1.2一人一单问题 看看数据库里有没有这个这个人下的订单&#xff1a; 1.单机模式中…

自动化测试 (五) 读写64位操作系统的注册表

自动化测试经常需要修改注册表 很多系统的设置&#xff08;比如&#xff1a;IE的设置&#xff09;都是存在注册表中。 桌面应用程序的设置也是存在注册表中。 所以做自动化测试的时候&#xff0c;经常需要去修改注册表 Windows注册表简介 注册表编辑器在 C:\Windows\regedit…

第二百一十五回 如何创建单例模式

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容&#xff0c;本章回中将介绍 如何创建单例模式.闲话休提&#xff0c;让我们一起Talk Flutter吧。 …

@KafkaListener 注解配置多个 topic

见如下示例 主要见 KafkaListener 中 topics 属性的配置 其中 ${xxxx.topic1} 为从springBoot 配置文件中读取的属性值 KafkaListener(topics {"${xxxx.topic1}", "${xxxx.topic2}"}, groupId "${xxxx.groupId}",containerFactory "xxx…

易点易动打通OA系统,实现固定资产高效管理

近年来,随着信息化建设的不断深入,OA系统在企业管理工作中的应用也日趋广泛。传统的固定资产管理存在数据分散,管理效率低等问题。深度整合易点易动和OA系统,可以打通各系统之间的数据通道,实现固定资产通过OA系统的全流程管理。这不仅可以提升管理效率,减轻人工管理成本,也更方…

部署LVS的NAT模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

Python-Selenium-使用 pywinauto 实现 Input 上传文件

当前环境&#xff1a;Win10 Python3.7 pywinauto0.6.8&#xff0c;selenium3.14.1 示例代码 from pywinauto import Desktop import osapp Desktop() dialog app[打开] dialog[Edit].set_edit_text(os.getcwd() .\\example-01.jpg) dialog[Button].click() 其他方法&…

接口测试的工具(3)----postman+node.js+newman

1.安装newman&#xff1a;输入命令之后 一定注意 什么都不要操作 静静的等待结束就行了。 2.安装失败的对此尝试不行 在用下面的方法 解压一下就行了 3.验证是否成功 多次尝试是可以在线安装成功的

SpringCloudAliBaba篇之Seata:分布式事务组件理论与实践

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成&#xff0c;事务具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID原则。 原子性(atomici…

在非联网、无网络环境下,fpm的安装和生成RPM包的使用案例

文章目录 前言1、安装fpm1.1、安装Ruby环境1.2、gem 安装 fpm 2、fpm使用2.1、fpm常用参数2.2、fpm使用案例2.2.1、fpmFirstDemo文件夹2.2.3、编写脚本文件2.2.4、生成RPM包2.2.5、RPM安装与卸载测试 前言 由于fpm采用Ruby语言开发&#xff0c;因此在使用之前需要先在您的虚拟…

AI日报:OpenAI扩大创业基金计划

欢迎订阅专栏 《AI日报》 获取人工智能邻域最新资讯 文章目录 OpenAI拓宽Converge启动程序变压器模型背后的思想建立启动融资新闻AutoGen AI支点其他 OpenAI拓宽Converge启动程序 ChatGPT制造商OpenAI正在扩大其Converge AI创业计划。 OpenAI的Converge产品于2022年12月首次…

力扣225. 用队列实现栈【附进阶版】

文章目录 力扣225. 用队列实现栈示例思路及其实现两个队列模拟栈一个队列模拟栈 力扣225. 用队列实现栈 示例 思路及其实现 两个队列模拟栈 队列是先进先出的规则&#xff0c;把一个队列中的数据导入另一个队列中&#xff0c;数据的顺序并没有变&#xff0c;并没有变成先进后…

【Python】—— 如果使用matplotlib做数据可视化

matplotlib做数据可视化 相关知识掌握matplotlib的基本使用方法1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图6. 等高线图7. 图形定制 掌握数据处理的基本方法1. 数据筛选2. 缺失值处理3. 异常值处理 理解数据可视化的原则和方法1. 选择合适的图表类型2. 避免数据混淆3. 突出重…

继电器的工作原理及驱动电路

继电器是具有隔离功能的自动开关元件&#xff0c;广泛应用于遥控、遥测、通讯、自动控制、机电一体化及电力电了设备中&#xff0c;是最重要的控制元件之一。继电器实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。…