linux驱动模块的加载和卸载

2023-11-15

Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块,这样我们修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linux 代码。而且在调试的时候只需要加载或者卸载驱动模块即可,不需要重启整个系统。总之,将驱动编译为模块最大的好处就是方便开发,当驱动开发完成,确定没有问题以后就可以将驱动编译进Linux 内核中,当然也可以不编译进 Linux 内核中,具体看自己的需求。模块有加载和卸载两种操作,我们在编写驱动的时候需要注册这两种操作函数,模块的加载和卸载注册函数如下:

module_init(xxx_init); //注册模块加载函数
module_exit(xxx_exit); //注册模块卸载函数

module_init 函数用来向 Linux 内核注册一个模块加载函数,参数 xxx_init 就是需要注册的具体函数,当使用“insmod”命令加载驱动的时候, xxx_init 这个函数就会被调用。 module_exit()函数用来向 Linux 内核注册一个模块卸载函数,参数 xxx_exit 就是需要注册的具体函数,当使用“rmmod”命令卸载具体驱动的时候 xxx_exit 函数就会被调用。字符设备驱动模块加载和卸载模板如下所示:

1 /* 驱动入口函数 */
2 static int __init xxx_init(void)
3 {
4 /* 入口函数具体内容 */
5 return 0;
6 }
7 8
/* 驱动出口函数 */
9 static void __exit xxx_exit(void)
10 {
11 /* 出口函数具体内容 */
12 }
13
14 /* 将上面两个函数指定为驱动的入口和出口函数 */
15 module_init(xxx_init);
16 module_exit(xxx_exit);

第 2 行,定义了个名为 xxx_init 的驱动入口函数,并且使用了“__init”来修饰。
第 9 行,定义了个名为 xxx_exit 的驱动出口函数,并且使用了“__exit”来修饰。
第 15 行,调用函数 module_init 来声明 xxx_init 为驱动入口函数,当加载驱动的时候 xxx_init函数就会被调用。
第16行,调用函数module_exit来声明xxx_exit为驱动出口函数,当卸载驱动的时候xxx_exit函数就会被调用。

驱动编译完成以后扩展名为.ko,有两种命令可以加载驱动模块: insmod和 modprobe, insmod是最简单的模块加载命令,此命令用于加载指定的.ko 模块,比如加载 drv.ko 这个驱动模块,命令如下:

insmod drv.ko

insmod 命令不能解决模块的依赖关系,比如 drv.ko 依赖 first.ko 这个模块,就必须先使用insmod 命令加载 first.ko 这个模块,然后再加载 drv.ko 这个模块。但是 modprobe 就不会存在这个问题, modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,因此modprobe 命令相比 insmod 要智能一些。 modprobe 命令主要智能在提供了模块的依赖性分析、
错误检查、错误报告等功能,推荐使用 modprobe 命令来加载驱动。 modprobe 命令默认会去/lib/modules/目录中查找块,比如本书使用的 Linux kernel 的版本号为 4.1.15,因此 modprobe 命令默认会到/lib/modules/4.1.15 这个目录中查找相应的驱动模块,一般自己制作的根文件系统中是不会有这个目录的,所以需要自己手动创建。
驱动模块的卸载使用命令“rmmod”即可,比如要卸载 drv.ko,使用如下命令即可:

rmmod drv.ko

也可以使用“modprobe -r”命令卸载驱动,比如要卸载 drv.ko,命令如下:

modprobe -r drv.ko

使用 modprobe 命令可以卸载掉驱动模块所依赖的其他模块,前提是这些依赖模块已经没有被其他模块所使用,否则就不能使用 modprobe 来卸载驱动模块。所以对于模块的卸载,还是推荐使用 rmmod 命令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux驱动模块的加载和卸载 的相关文章

  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 添加文件时运行 shell 命令

    我的 Linux 机器上有一个名为 images 的文件夹 该文件夹连接到一个网站 该网站的管理员可以向该网站添加图片 但是 当添加图片时 我想要一个命令来运行调整目录中所有图片的大小 简而言之 我想知道当新文件添加到特定位置时如何使服务器
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序

随机推荐

  • c# attribute

    C 中的Attribute 目录 什么是Attribute 深入讨论Attribute 实现自己的Attribute时需要注意的一些问题 一 什么是Attribute 先看下面的三段代码 自定义Attribute类 VersionAttri
  • MIT 6.S965 韩松课程 05

    Lecture 05 Quantization Part 1 文章目录 Lecture 05 Quantization Part 1 动机 数字的数据类型 整数 定点数 浮点数 量化 基于 K Means 的量化 Han et al ICL
  • 更换jdk引发的惨案

    eclipse ini 第一行加入 vm E Java jdk1 7 0 17 bin javaw exe
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • Unity——第一/三人称控制器的使用

    每日一句 恰似人间惊鸿客 墨染星辰云水间 第一人称控制器 MainCamera PlayerCapsule PlayFollowCamera gt 相机跟随 PlayerCameraRoot 第三人称控制器 PlayerArmature M
  • academic disqualification怎么办?求真带你解除危机

    academic disqualification怎么办 因为GPA低 严重或多次学术违纪等原因被美国大学开除 失去美国学生身份 是很多留学生最不愿意看到的留学结果 一旦遭遇美国大学停学或者开除 大家一定要重视起来 不能放任自己的身份 黑
  • 海思3559A上编译libyuv源码操作步骤

    1 下载libyuv源代码 执行 git clone https chromium googlesource com libyuv libyuv 2 通过CMakeLists txt编译生成库 build sh脚本内容如下 cmake DC
  • Java学习笔记之“比较字符串”

    本文为在How2j的学习总结 只代表个人见解 如有不妥 望指出以便更正 问题描述 创建一个长度是1000的字符串数组 使用长度是2的随机字符填充该字符串数组 统计这个字符串数组里重复的字符串有多少种 注 需要去除重复次数大于2的情况 pac
  • 热门的四款RK3399系列板卡产品大PK-谁是当家花旦?

    热门的四款RK3399系列板卡产品大PK 谁是当家花旦 大家好 我是资深嵌入式爱好者老李 今天来给大家推荐市场上六款 性能超凡 的RK3399板子 哪一款是当家花旦 你最喜爱哪一款 欢迎留言 主控芯片 Rockchip RK3399 CPU
  • 转: angularjs学习总结(~~很详细的教程)

    1 前言 前端技术的发展是如此之快 各种优秀技术 优秀框架的出现简直让人目不暇接 紧跟时代潮流 学习掌握新知识自然是不敢怠慢 AngularJS是google在维护 其在国外已经十分火热 可是国内的使用情况却有不小的差距 参考文献 网络文章
  • 运算符之比较运算符和逻辑运算符

    1 比较运算符 是两个数据之间进行比较的运算 运算结果都是布尔值true和false 赋值运算符包括 比较符号两边数据是否相等 相等结果是true lt 比较符号左边的数据是否小于右边的数据 如果小于结果是true gt 比较符号左边的数据
  • method:com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal问题解决

    目录 1 问题复现 2 问题分析 3 解决问题 如何禁用 Ping Method 4 禁用 Ping Method的后果 5 两者之间的权宜之计 1 问题复现 ERROR 2023 07 23 18 03 03 427 method com
  • 为什么postman调接口不会跨域而浏览器会

    为什么postman调接口不会跨域而浏览器会 都在说跨域 为什么postman能访问接口 而浏览器就不行呢 这里需要理解什么是跨域 跨域是指的当前资源访问其他资源时发起的http请求由于安全原因 由于同源策略 域名 协议 端口中只要有一个不
  • SpringCloud组件之Gateway网关详细教程

    目录 一 概念 1 1 什么是微服务网关 1 2 为什么需要使用网关 网关的作用 1 3网关的好处 二 Gateway网关的快速入门 1 快速创建 2 网关路由的流程 3 Gateway断言工厂 predicates 4 gateway过滤
  • Java与Native相互调用示例及讲解

    一 背景 今天介绍如何在层通过jni调用native方法 同时native层如何回调java方法 二 java层实现 TestNative java public class TestNative static 加载native层源码编译得
  • 二叉树 二度节点和叶子节点之间的数量关系

    结论 二叉树中度数为2的节点数量比叶子节点少一个 证明 设0度节点 叶子节点 一度节点 二度节点数量分别为n0 n1 n2 那么总的点数为n n0 n1 n2 而边的数量为m n 1 树的性质 同时又有m 2 n2 1 n1 0 n0 所以
  • arm NEON学习

    目录 0 rgb2gray函数 1 累加和 2 两个数组相关映射元素的乘积和 3 矩阵乘法 参考 arm NEON简介 快速上手指南 清晰的简介 参考手册 SIMD 一条指令处理多个数据 在32bit内核处理器上 如cortexA系列 如果
  • 融云服务器实时消息路由,融云开发者文档

    融云 IM 聊天室中是否包含视频流 IMLib 聊天室中不包含视频直播 包含与 IM 相关功能 如消息发送 聊天室控制等 视频直播视频流的录制 播放可使用融云 RTC SDK 低延时直播 聊天室如何销毁 销毁方式有两种 1 主动调用融云 S
  • 数据类型(初学者的一点经验)

    数据类型 char 字符类型 1字节 short 短整型 2字节 int 整形 4字节 long 长整形 4或8字节 long long 更长整形 没有三个以上的long组成的 8字节 float 单精度浮点数 4字节 double 双精度
  • linux驱动模块的加载和卸载

    Linux 驱动有两种运行方式 第一种就是将驱动编译进 Linux 内核中 这样当 Linux 内核启动的时候就会自动运行驱动程序 第二种就是将驱动编译成模块 Linux 下模块扩展名为 ko 在Linux 内核启动以后使用 insmod