一. 简介
前面几篇文章编写了 字符设备驱动模块加载与卸载框架代码,设置了开发板启动方式。文章地址如下:
字符设备驱动框架的编写-CSDN博客
字符设备驱动模块的编译-CSDN博客
字符设备驱动的加载与卸载前工作-CSDN博客
本文学习如何加载与卸载驱动模块。
二. 字符设备驱动的加载与卸载
上一篇文章做了字符驱动模块加载前的工作。具体工作为:
开发板设置为 从 SD卡启动,即 SD卡内烧写了uboot,开发板 从 SD卡中启动 uboot。
通过 tftp服务从 ubuntu系统下加载 内核镜像 zImage与 .dtb设备树文件,通过 nfs服务从 ubuntu系统下加载 根文件系统 rootfs。
1. 加载字符设备驱动模块
前面一篇文章编写了初步的字符设备驱动框架,最后,编译出了 .ko 文件,这里将编译出来的驱动文件即 .ko文件放到根文件系统 rootfs 中。
(1) 加载模块命令
加载模块命令有两种:insmod 命令和 modprobe 命令
insmod 命令
modprobe 命令
(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。
输入“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. 卸载字符设备驱动模块
/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 #
可以看出,驱动模块已经不存在,说明驱动模块已经成功卸载了。