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、测试
再来测试加载驱动和卸载驱动
这里都已经打印提示信息,说明驱动出口和入口函数都已经执行了
Linux驱动3:驱动模块加载与卸载相关推荐
- Linux驱动模块加载和卸载以及设备注册与注销
一.驱动模块的加载和卸载 Linux驱动有两种运行方式,第一种就是将驱动编译进Linux内核中,这样当Linux内核启动的时候就会自动运行驱动程序.第二种就是将驱动编译成模块(Linux下模块扩展名为 ...
- Linux驱动之内核加载模块过程分析
Linux内核支持动态的加载模块运行:比如insmod first_drv.ko,这样就可以将模块加载到内核所在空间供应用程序调用.现在简单描述下insmod first_drv.ko的过程 1.in ...
- linux驱动之可加载模块
Linux 的众多优良特性之一就是可以在运行时扩展由内核提供的特性的能力. 这意味着你可以在系统正在运行着的时候增加内核的功能( 也可以去除 ). 每块可以在运行时添加到内核的代码, 被称为一个模块. ...
- Linux系统开机自动加载驱动module
Linux系统的驱动默认存放目录为: /lib/modules/$(uname -r)/kernel/drivers,因此如果希望系统可以启动时自动加载驱动必须首先把驱动放到该目录下面,执行完此步操作 ...
- Linux如何加载与卸载U盘
Linux如何加载与卸载U盘 第一:以root用户登陆 先加载USB模块 modprobe usb-storage 用fdisk -l 看看U盘的设备 假如U盘是sda1 第二:确定在 目录 ...
- Windows CE下流驱动的动态加载
Windows CE下流驱动的动态加载 闲话少说,进入正题.查找EVC的帮助,发现函数ActivateDevice()可用来加载驱动程序.而这个函数的使用是相当简单的.我就不多说了,贴上一段帮助最能说 ...
- 基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块(卸载DLL、EXE和sys等加载)
背景 对于内核层实现监控模块的加载,包括加载DLL模块.内核模块等.你也许会想到 HOOK 各种内核函数来实现.确定,在内核层中的 HOOK 已经给人留下太多深刻的印象了,有 SSDT HOOK.In ...
- Linux RedHat CentOS 操作系统加载挂载U盘、USB移动硬盘方法
插上USB存储设备后,先用 fdisk -l 或 parted -l 命令来查询操作系统检测到的磁盘详细列表, 找到插入的设备在系统的代号,如sda1, sda2, sdb1, sd2--然后继续操作 ...
- WINCE流驱动的自动加载
********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...
最新文章
- 获得 bootstrapTable行号index
- 初学微信小程序 TodoList
- boost::proto::protect相关的测试程序
- android 短信ril移植,将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现...
- CGLib与JDK的动态代理
- 用PowerShell收集服务器日检报告,并发邮件给管理员
- Linux之SSH安全,使用密钥对验证
- crf的实现 keras_keras 解决加载lstm+crf模型出错的问题
- 浏览器内核的解析和对比
- am3352偶发上电不启动问题分析
- MAC安装中文输入法Rime
- Python 测试广告语敏感词
- 小打卡软件测试,考勤打卡软件大测评,这款打卡软件你有在用吗?
- Carbon —— 代码分享利器
- soul显示服务器异常,soul账号状态异常是什么意思?soul账号异常操作多久解封
- 基于变色龙认证树的云边端协同流式数据完整性验证模型
- 如何用随机森林算法,在深海养肥一群鱼
- 新年金市上行动力堪忧 美债收益率大幅上涨
- input如何禁止文本框输入的方法
- 【公务员考试】结构化面试时间一般多长?