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

发布时间:2023年12月19日

一. 简介

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

字符设备驱动框架的编写-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

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 # 

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

文章来源:https://blog.csdn.net/wojiaxiaohuang2014/article/details/135066540
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。