Linux驱动3:驱动模块加载与卸载

目录

一、环境配置

 1、开发板环境

2、uboot环境

①设置bootargs

②设置bootcmd

二、加载驱动与卸载驱动

 1、加载命令选择

2、创建目录环境以及驱动文件复制

3、加载驱动 

提示①“modprobe: can't open 'modules.dep': No such file or directory”

 提示②module license 'unspecified'

4、卸载驱动

提示②module license 'unspecified'的解决

三、测试驱动入口函数和出口函数

1、printk 

2、测试 


一、环境配置

 1、开发板环境

开发板通过从SD卡启动,SD卡里面烧写了uboot,开发板能ping通ubantu

uboot通过tftp从ubuntu里面获取zimage和dtb,rootfs也是通过nfs挂载

2、uboot环境

①设置bootargs

setenv bootargs='console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.1.222:/home/ubantu22/nfs/rootfs ip=192.168.1.221:192.168.1.222:192.168.1.1:255.255.255.0::eth0:off'

“console”为设置串口和波特率,“rw”是可读可写权限,"root"告诉内核要通过网络取得根文件系统

“nfsroot”后面ip为uabntu的ip,路径为根文件系统路径

“ip”第一个是开发板ip,第二个是ubantu的ip第三个是网关,第四个是子网掩码

“eth0”设置使用的网口

记得使用saveenv命令进行保存

②设置bootcmd

setenv bootcmd='tftp 80800000 zImage;tftp 83000000 imx6ull-my-emmc.dtb;bootz 80800000 - 83000000;'

通过tftp下载zImage到80800000和.dtb设备树下载到83000000

用bootz启动

记得使用saveenv命令进行保存

二、加载驱动与卸载驱动

 1、加载命令选择

驱动编译完成以后扩展名为.ko,有两种命令可以加载驱动模块: insmod和 modprobe

 insmod是最简单的模块加载命令,此命令用于加载指定的.ko 模块,但是insmod 命令不能解决模块的依赖关系,比如 drv.ko 依赖 first.ko 这个模块,就必须先使用insmod 命令加载 first.ko 这个模块,然后再加载 drv.ko 这个模块,所以不建议使用这个


modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,因此modprobe 命令相比 insmod 要智能一些。 modprobe 命令主要智能在提供了模块的依赖性分析、错误检查、错误报告等功能,推荐使用 modprobe 命令来加载驱动

要注意的是,modprobe 命令默认会去/lib/modules/<kernel-version>目录中查找模块,比如这里使用的 Linux kernel 的版本号为 4.1.15,因此 modprobe 命令默认会到/lib/modules/4.1.15 这个目录中查找相应的驱动模块,一般自己制作的根文件系统中是不会有这个目录,所以需要自己手动创建

2、创建目录环境以及驱动文件复制

cd lib

mkdir modules

cd modules

mkdir 4.1.15

cd 4.1.15

 这就进入到/lib/modules/4.1.15的目录下了,在ubantu里面把驱动放到这个目录下,如下图

 在开发板上面查看一下.ko文件,如下图

3、加载驱动 

利用modprobr加载驱动,如下图

 

 这里错误提示“modprobe: can't open 'modules.dep': No such file or directory”

提示①“modprobe: can't open 'modules.dep': No such file or directory”

modprobe 提示无法打开“modules.dep”这个文件,因此驱动挂载失败了。对于一个新的模块使用modprobe加载的时候需要先调用一下depmod命令,直接输入 depmod 命令即可自动生成modules.dep,不用手动创建。有些根文件系统可能没有 depmod 这个命令,如果没有这个命令就只能重新配置busybox,使能此命令,然后重新编译 busybox。输入“depmod”命令以后会自动生成 modules.alias、modules.symbols 和 modules.dep 这三个文件,如下图

 下面重新加载驱动,使用modprobe如下图

 提示②module license 'unspecified'

这里有提示“chrdevbase: module license 'unspecified' taints kernel.Disabling lock debugging due to kernel taint”,意为未指定许可证,这里暂时不管,学完卸载驱动后进行解决

下面用“lsmod”查看一下当前的驱动模块都有那些,如下图

可以看到已经有chrdevbase的驱动了

4、卸载驱动

利用“remod”卸载驱动,如下图

chrdevbase 驱动已经被卸载了

下面先解决刚刚加载驱动后出现的提示

提示②module license 'unspecified'的解决

重新加载驱动,如下图

这次重新加载就没有错误提示了,而且也成功加载,可能是只提示一次,但还是要解决

出现提示“chrdevbase: module license 'unspecified' taints kernel主要是因为驱动没有 license信息

下面在编译驱动的c文件里面添加 license信息和作者信息(可不加),代码如下

MODULE_LICENSE("GPL");                        /* license许可信息,采用 GPL 协议*/
MODULE_AUTHOR("ba che kai qi lai");        /*作者*/

 重新编译,再拷贝到开发板根文件系统的/lib/modules/4.1.15的目录下

 先把已经加载的chrdevbase驱动卸载

 重启开发板来测试是否还会有提示,重新加载驱动

可以看到不再出现“module license 'unspecified' ”的提示了

三、测试驱动入口函数和出口函数

1、printk 

先了解一下关于printf和printk,在内核里面没有printf这个函数的

printf运行在用户态,而printk运行在内核态,printk使用有等级之分,具体可以自行了解

想要在内核里面向控制台输出或显示一些内容就需要用printk这个函数

在驱动入口函数里面输入下面代码

#include<linux/kernel.h>
#include<linux/init.h>

printk("chrdevbase_init\r\n");

printk("chrdevbase_exit\r\n");

 添加完成重新编译和复制到开发板根文件系统的/lib/modules/4.1.15的目录下

2、测试 

 再来测试加载驱动和卸载驱动

这里都已经打印提示信息,说明驱动出口和入口函数都已经执行了 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux卸载驱动命令通常为"rmmod"。该命令用于从内核中卸载加载驱动程序。使用该命令需要管理员权限。例如,要卸载名为"mydriver"的驱动程序,可以使用以下命令: sudo rmmod mydriver 请注意,卸载驱动程序可能会导致系统出现问题,因此在执行此操作之前,请确保您知道自己在做什么,并备份重要数据。 ### 回答2: Linux系统中,卸载驱动命令主要包括以下几个方面。 1. lsmod命令:该命令可以显示当前加载的所有内核模块,可以通过该命令查找到需要卸载驱动对应的内核模块名称。 2. rmmod命令:该命令可以卸载一个已经加载的内核模块,具体语法如下: sudo rmmod <模块名称> 例如,如果需要卸载名为“abc”的内核模块,可以执行以下命令: sudo rmmod abc 注意,如果该模块正在被使用,卸载操作可能会失败,因此需要先停止相关进程或软件,再执行卸载操作。 3. modprobe命令:该命令可以根据需要自动加载卸载内核模块,并处理依赖关系。具体语法如下: sudo modprobe [-r] <模块名称> 如果省略“-r”选项,则表示自动加载指定的模块;如果使用“-r”选项,则表示自动卸载指定的模块。 总之,卸载驱动命令主要是通过卸载对应的内核模块来实现的。在卸载之前,需要先查找到需要卸载的模块名称,然后通过rmmod或modprobe命令执行卸载操作。需要注意的是,卸载操作可能会影响到系统的正常运行,因此需要谨慎执行,尽可能在备份数据或创建系统恢复点之后再进行操作。 ### 回答3: 在Linux中,驱动程序可以是内核模块或独立的二进制文件。以下是删除Linux驱动程序的几种方法: 1. 使用rmmod命令: rmmod是一个用于删除内核模块的命令。要删除已加载驱动程序,请使用以下命令: ``` sudo rmmod <module_name> ``` 2. 删除.ko文件:如果驱动程序是以.ko文件的形式存在于Linux文件系统中,可以使用以下命令将其删除: ``` sudo rm /lib/modules/$(uname -r)/kernel/<module_name>.ko ``` **注意:**在命令中,`$(uname -r)`表示当前正在运行的内核版本,`/lib/modules/`是Linux模块的存储库所在的默认位置。 3. 使用dpkg命令:如果驱动程序是通过deb包安装的,可以使用dpkg命令删除它。 运行以下命令: ``` sudo dpkg -r <package_name> ``` **注意:**在命令中,`<package_name>`指安装了驱动程序的软件包名称。 4. 执行脚本文件:驱动程序通常由安装程序安装,它们通常包含卸载脚本以将其删除。这些脚本位于驱动程序安装文件夹中。运行以下命令: ``` sudo sh /path/to/uninstall_script.sh ``` **注意:**在命令中,`/path/to/uninstall_script.sh`指安装程序提供的卸载脚本文件的路径。 无论使用哪种方法删除Linux驱动程序,请确保在执行任何操作之前备份数据。遵循正确的步骤以免意外删除系统文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值