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

这篇具有很好参考价值的文章主要介绍了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

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

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

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

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

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

3、加载驱动 

利用modprobr加载驱动,如下图

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

 这里错误提示“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 这三个文件,如下图

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

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

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

 提示②module license 'unspecified'

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

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

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

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

4、卸载驱动

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

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

chrdevbase 驱动已经被卸载了

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

提示②module license 'unspecified'的解决

重新加载驱动,如下图

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

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

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

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

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

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

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

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

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

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

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

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

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

可以看到不再出现“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");

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

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

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

2、测试 

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

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

这里都已经打印提示信息,说明驱动出口和入口函数都已经执行了 文章来源地址https://www.toymoban.com/news/detail-449001.html

到了这里,关于Linux驱动3:驱动模块加载与卸载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux驱动】VScode 环境简单配置

    在开始编写驱动之前,我们需要保证良好的编码环境,这里编写代码所使用的编辑器是VScode,如果进行环境配置,可能会提示很多错误,比如头文件找不到、内核函数的定义无法跳转等等。 VScode 在这里只作为编辑器使用,配置的 是编辑环境 ,而 不是编译环境 。 目录 一、

    2024年02月14日
    浏览(41)
  • 【VSCode】VScode 配置 Linux 驱动环境(简单版)

    在开始编写驱动之前,我们需要保证良好的编码环境,这里编写代码所使用的编辑器是VScode,如果进行环境配置,可能会提示很多错误,比如头文件找不到、内核函数的定义无法跳转等等。 VScode 在这里只作为编辑器使用,配置的 是编辑环境 ,而 不是编译环境 。 目录 一、

    2024年02月08日
    浏览(60)
  • Linux内核显示、加载、卸载等超实用命令

    内核模块是 Linux 系统中一种特殊的可执行文件,它可以在运行时动态地加载到内核中或卸载出内核,从而实现内核的扩展和优化。内核模块操作相关的命令主要有以下几种: 列出当前已加载的内核模块及其依赖关系和使用情况。 将指定的内核模块加载到内核中,需要提供完

    2024年02月08日
    浏览(60)
  • 详解Linux环境下卸载MySQL

    最后查看一下是否卸载完毕,无结果说明卸载完成。

    2024年03月21日
    浏览(33)
  • 修改linux的/sys目录下内核参数、模块...

    ① /sys/devices 该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devices和system devices。platform devices一般是挂在芯片内部的高速或者低速总线上的各种控制

    2024年02月05日
    浏览(62)
  • linux 安全系列目录 - seccomp安全模块问题排查

    涉及seccomp安全模块问题时,可以参照本文档案例进行扩展分析,可以多访问文中的链接,很有用。 通过使用libseccomp,开发人员可以定义一组允许的系统调用规则,从而限制应用程序的系统调用(system call)集合,阻止对潜在危险的系统调用的调用。它最初被用于 cpushare 这个

    2024年02月05日
    浏览(56)
  • 如何将模块加载到linux内核

    假设存在一个文件叫mymq.c,下该文件相同目录下的makefile如下语句: obj-y += mymq.o 然后编译:编译完成了以后,mymq.c文件中,有个函数叫mymq_open,搜索这个函数在不在System.map文件中,如果在,就说明这个模块被内置到内核中了。 执行grep -rn mymq_open System.map,在文件System.map中搜索

    2023年04月24日
    浏览(61)
  • Linux 卸载、安装 anaconda 以及新建环境

    卸载 anaconda 博客 参照上述博客可以卸载 anaconda,注意编辑文件时,i 是进入输入模式,修改完毕后保存并退出操作是:先按 Esc 退出输入模式,shift+:+wq+Enter 即可保存修改并退出。 安装 anaconda 博客 参照上述博客可以安装 anaconda 同时也有第三部分的 pytorch 下载教程 在 pytorch

    2024年02月12日
    浏览(48)
  • Linux环境如何彻底卸载感干净RabbitMQ

    总共就两步。 1、卸载前先停掉rabbitmq服务,执行命令 2、查看rabbitmq安装的相关列表 3、卸载rabbitmq已安装的相关内容 1、查看erlang安装的相关列表 2、卸载erlang已安装的相关内容

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包