uevent 驱动_uevent分析(和设备驱动有关)
1.kobject, ktype, kset
kobject代表sysfs中的目录。
ktype代表kobject的类型,主要包含release函数和attr的读写函数。比如,所有的bus都有同一个bus_type;所有的class都有同一个class_type。
kset包含了subsystem概念,kset本身也是一个kobject,所以里面包含了一个kobject对象。另外,kset中包含kset_uevent_ops,里面主要定义了三个函数
int (*filter)(struct kset *kset, struct kobject *kobj);
const char *(*name)(struct kset *kset, struct kobject *kobj);
int (*uevent)(struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env);
这三个函数都与uevent相关。filter用于判断uevent是否要发出去。name用于得到subsystem的名字。uevent用于填充env变量。
2.uevent内核部分
uevent是sysfs向用户空间发出的消息。比如,device_add函数中,会调用kobject_uevent(&dev->kobj, KOBJ_ADD); 这里kobj是发消息的kobj,KOBJ_ADD是发出的事件。uevent的事件在kobject_action中定义:
enum kobject_action {
KOBJ_ADD,
KOBJ_REMOVE,
KOBJ_CHANGE,
KOBJ_MOVE,
KOBJ_ONLINE,
KOBJ_OFFLINE,
KOBJ_MAX
};
int kobject_uevent(struct kobject *kobj, enum kobject_action action)
{
return kobject_uevent_env(kobj, action, NULL);
}
kobject_uevent_env:
由kobject的parent向上查找,直到找到一个kobject包含kset。
如果kset中有filter函数,调用filter函数,看看是否需要过滤uevent消息。
如果kset中有name函数,调用name函数得到subsystem的名字;否则,subsystem的名字是kset中kobject的名字。
分配一个kobj_uevent_env,并开始填充env环境变量:
增加环境变量ACTION=
增加环境变量DEVPATH=
增加环境变量SUBSYSTEM=
增加环境变量kobject_uevent_env中参数envp_ext指定的环境变量。
调用kset的uevent函数,这个函数会继续填充环境变量。
增加环境变量SEQNUM=,这里seq是静态变量,每次累加。
调用netlink发送uevent消息。
调用uevent_helper,最终转换成对用户空间sbin/mdev的调用。
3.uevent用户空间部分
uevent的用户空间程序有两个,一个是udev,一个是mdev。
udev通过netlink监听uevent消息,它能完成两个功能:
1.自动加载模块
2.根据uevent消息在dev目录下添加、删除设备节点。
另一个是mdev,mdev在busybox的代码包中能找到,它通过上节提到的uevent_helper函数被调用。
下面简要介绍udev的模块自动加载过程:
etc目录下有一个uevent规则文件/etc/udev/rules.d/50-udev.rules
udev程序收到uevent消息后,在这个规则文件里匹配,如果匹配成功,则执行这个匹配定义的shell命令。例如,规则文件里有这么一行:
ACTION=="add", SUBSYSTEM=="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe $env{MODALIAS}"
所以,当收到uevent的add事件后,shell能自动加载在MODALIAS中定义的模块。
mdev的模块自动加载过程与之类似,它的配置文件在/etc/mdev.conf中。例如:
$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"
这条规则指的是:当收到的环境变量中含有MODALIAS,那么加载MODALIAS代表的模块。
mdev的详细说明在busybox的docs/mdev.txt中。
4.uevent在设备驱动模型中的应用
在sys目录下有一个子目录devices,代表一个kset。
创建设备时,调用的device_initialize函数中,默认会把kset设置成devices_kset,即devices子目录代表的kset。
devices_kset中设置了uevent操作集device_uevent_ops。
static struct kset_uevent_ops device_uevent_ops = {
.filter = dev_uevent_filter,
.name = dev_uevent_name,
.uevent = dev_uevent,
};
dev_uevent_filter中,主要是规定了要想发送uevent,dev必须有class或者bus。
dev_uevent_name中,返回dev的class或者bus的名字。
dev_uevent函数:
如果dev有设备号,添加环境变量MAJOR与MINOR。
如果dev->type有值,设置DEVTYPE=type->name>。
如果dev->driver,设置DRIVER=driver->name>。
如果有bus,调用bus的uevent函数。
如果有class,调用class的uevent函数。
如果有dev->type,调用dev->type->uevent函数。
一般在bus的uevent函数中,都会添加MODALIAS环境变量,设置成dev的名字。这样,uevent传到用户空间后,就可以通过对MODALIAS的匹配自动加载模块。这样的bus例子有platform和I2C等等。
uevent 驱动_uevent分析(和设备驱动有关)相关推荐
- linux内核组件分析之--设备驱动模型之bus
前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起.本节就来看看设备驱动模型中起枢纽作用的bus.本节的头文件 ...
- linux内核部件分析之——设备驱动模型之class
前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...
- linux内核部件分析(十)——设备驱动模型之class,linux内核部件分析(十)——设备驱动模型之class...
前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...
- 获取另一个驱动的设备结构体_《rt-thread驱动框架分析》-i2c驱动
驱动分析 I2C设备驱动框架图: 我们先RT-Thread的I2C框架图(这是我自己理解的框架图,如果不对的地方,请指出): 上图是我分析的RTT的I2C框架图.主要分为三层,驱动层-核心层-设备层. ...
- linux alsa声卡驱动原理分析- 设备打开过程和数据流程,linux alsa声卡驱动原理分析解析- 设备打开过程跟数据流程资料.ppt...
linux alsa声卡驱动原理分析解析- 设备打开过程跟数据流程资料 Linux ALSA声卡驱动原理分析 -设备打开过程和数据流程;目 录;目 录;一.导 读;目 录;二.ALSA架构简介;二. ...
- Linux 设备驱动篇之I2c设备驱动
******************************************************************************************** 装载声明:希望 ...
- Linux设备驱动01:Linux设备驱动概述
目录 1. 设备驱动的作用 2. 有无操作系统时的设备驱动 2.1 无操作系统 2.1.1 硬件.驱动和应用程序的关系 2.1.2 单任务软件典型架构 2.2 有操作系统 2.2.1 硬件.驱动.操作 ...
- linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程
目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...
- Linux驱动开发:字符设备驱动开发实战
Linux驱动开发:字符设备驱动开发实战 一.工程创建 VSCode 创建工程,设置 C/C++ 配置,导入 linux kernel 源码目录,方便 vscode 写代码自动补全,vscode 配置 ...
- 《rt-thread驱动框架分析》-lcd驱动
简介 rt-smart相关文章 <rt-smart的第一个应用程序,imx6ull用户态点灯> <rt-smart用户态通过IPC通信玩转传感器数据> rt-thread驱动相 ...
最新文章
- C语言通过函数参数不能带出动态内存的例子。
- 读《java的讲座》后感,老师讲座听后感
- Android学习--持久化(三) SQLite LitePal
- idea下一次Jar包依赖问题的解决过程
- 只在当前页面生效的css样式,修改页面中的一个样式 仅在当前页面生效
- html中图片阴影怎么写,css如何给图片加阴影?
- csss中box-sizing的问题 元素在另一个元素中框框包含的问题
- 电机转速模糊pid控制
- my ReadBook_4juan / zikao / zixuekaoshi
- 暴风电视TV 55X 3.0系统通过adb Root修改桌面,删除无用app
- oracle数据库一个汉字占几个字节
- 项目工程设计图纸内容规范
- 利用Python将视频文件转成语音文件
- android简单的自定义涂鸦控件
- 【心理学硕士论文】内观认知疗法对手机成瘾倾向的影响研究(节选)
- 机器学习建模工具PyCaret详讲
- 副主任医师计算机英语,医院职称的英语叫法
- vue 点击打开新窗口
- 【AI 学习】2.机器学习和深度学习综述
- 为什么内马尔要离开巴萨去巴黎?
热门文章
- 如何将pdf文件转为jpg格式,而不损失清晰度
- USB3.0 Type-c 拆解
- 手把手教您制作馈线焊接M头
- 2020A证(安全员)模拟考试系统及A证(安全员)实操考试视频
- 国外宾友对宾得镜头的排名(有一定意义)_我是亲民_新浪博客
- 法人的法定代表人怎样确定
- IDEA 阿里Code
- 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)转
- nginx 同域名同端口多种不同路径的用法
- oracle revoke 列_Oracle 权限(grant、revoke)