linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent【转】...
转自:http://blog.csdn.net/myarrow/article/details/8259888
1.kobject, ktype, kset
1) kobject: 代表sysfs中的目录。
2) ktype: 代表kobject的类型,主要包含release函数和attr的读写函数。比如,所有的bus都有同一个bus_type;所有的class都有同一个class_type。
3) 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=<action name>
增加环境变量DEVPATH=<kobj’s path>
增加环境变量SUBSYSTEM=<subsystem name>
增加环境变量kobject_uevent_env中参数envp_ext指定的环境变量。
调用kset的uevent函数,这个函数会继续填充环境变量。
增加环境变量SEQNUM=<seq>,这里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=<dev->type->name>。
如果dev->driver,设置DRIVER=<dev->driver->name>。
如果有bus,调用bus的uevent函数。
如果有class,调用class的uevent函数。
如果有dev->type,调用dev->type->uevent函数。
一般在bus的uevent函数中,都会添加MODALIAS环境变量,设置成dev的名字。这样,uevent传到用户空间后,就可以通过对MODALIAS的匹配自动加载模块。这样的bus例子有platform和I2C等等。
转自:http://blog.csdn.net/bingqingsuimeng/article/details/7924473
linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent【转】...相关推荐
- linux ftp 团队认证,linux下ftp和ftps以及ftp基于mysql虚拟用户认证服务器的搭建
linux下ftp和ftps以及ftp基于mysql虚拟用户认证服务器的搭建 1.FTP协议:有命令和数据连接两种 命令连接,控制连接:21/tcp 数据连接: 主动模式,运行在20/tcp端口 和 ...
- linux kobject-uevent(热插拔事件)
sysfs文件系统主要功能是将系统中所有的设备通过一个拓扑结构全部展示出来,在系统启动的初期,系统通过mount命令将syfs文件系统挂载到/sys节点上, mount -t sysfs sysfs ...
- linux下使用 du查看某个文件或目录占用磁盘空间的大小
du -ah --max-depth=1 其中a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度.
- Linux音频设备驱动_OSS驱动框架(四)————OSS 用户空间编程
一.DSP 编程 对OSS 驱动声卡的编程使用Linux 文件接口函数,DSP 接口的操作一般包括如下几个步骤: ① 打开设备文件/dev/dsp 采用何种模式对声卡进行操作也必须在打开设备时指定,对 ...
- Linux下select, poll和epoll IO模型的详解
http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...
- linux的open的非组赛,Linux下的非阻塞IO库epoll
今天看到一篇文章,对于epoll讲解的非常生动清晰,转载收藏一下,原文请点击here. 生活中的一个例子 假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里, ...
- linux下Epoll实现简单的C/S通信
From: http://blog.csdn.net/piaojun_pj/article/details/6103709 epoll的优点: 1.支持一个进程打开大数目的socket描述符(FD) ...
- ubuntu如何调出python_ubuntu|linux下 如何用python 模拟按键
匿名用户 1级 2013-10-31 回答 ubuntu下,也就是linux下,通常会用kill -事件编号实现. 你查一下LINUX下的事件就明白了. kill 进程号 实现上是发了一个信号给指定的 ...
- Linux下的LWP(轻量级进程)、进程 、 线程、用户级线程、内核线程
一.定义 再看正文之前我要先强调一下几点: 1. Linux中没有真正的线程,但windows中确实有线程 2. Linux中没有的线程是由进程来模拟实现的(又称作:轻量级进程) 3. 所以在Linu ...
最新文章
- php和css一样吗,php和css一样吗
- JavasScript基数排序
- 只需0行代码 | 文科生也能画词云图!
- php运行代码运行退出为0,php – Selenium测试用例返回进程以退出代码0结束
- GitLab CI 自动部署netcore web api 到Docker
- 搜狗拼音输入法linux 18.04,解决Ubuntu 18.04中文输入法的问题,Ubuntu 18.04安装搜狗拼音...
- 牛年喜庆红色字体标题PSD素材!
- caj文件浏览器_知网上PDF文件下载的问题怎么解决?
- 基于命令行编译打包phonegap for android应用
- python的设计模式
- HTML将广告关闭的JS代码,带关闭漂浮广告代码_漂浮广告js代码_漂浮窗口模式关闭...
- python程序设计实训心得体会_20194220 实验四《Python程序设计》实验报告
- OSPF配置实验报告
- 1、贪心NLP——课程介绍及NLP概论
- 如何给页面添加背景音乐
- 使用Ruby搭建Redis 集群
- keil4单片机串口通信
- js插件开发的一些感想和心得-引狼狼的蓝胖子
- 三重积分平均值_有关研究生考试中高等数学 分级中 “数农”是什么意思?
- 华为交换机端口不配置access_华为交换机屏蔽端口号