转自: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【转】的更多相关文章

  1. [转帖]linux下使用 du查看某个文件或目录占用磁盘空间的大小

    linux下使用 du查看某个文件或目录占用磁盘空间的大小 du -ah --max-depth= 去年用过一次 后来忘记了.. 命令这个东西 熟能生巧.. https://www.cnblogs.c ...

  2. Linux 内核热插拔事件产生

    一个热插拔事件是一个从内核到用户空间的通知, 在系统配置中有事情已经改变. 无论何 时一个 kobject 被创建或销毁就产生它们. 这样事件被产生, 例如, 当一个数字摄像头 使用一个 USB 线缆 ...

  3. linux下使用 du查看某个文件或目录占用磁盘空间的大小

    du -ah --max-depth=1     这个是我想要的结果  a显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小但是由于用了--max-depth选项,表示显示目录下所有 ...

  4. 怎么样linux下的目录名的目录,系统用来操作空间

    在Windows操作系统可以容易地创建\举\空删除的目录名格目录, 在linux我们需要一些特殊的处理能力实现上述功能. (1)创建一个目录 mkdir my\ first 此命令创建一个目录&quo ...

  5. Linux下制作不用密码可立即登录的SSH用户

    一.客户端建立两把钥匙 (1)本例以客户端的monkey用户为例,首先切换到~/.ssh目录下,如果没有该目录的话,需要进行新建 cd ~ mkdir .ssh chmod 700 .ssh cd ~ ...

  6. Linux下Power Management开发总结

    本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 1. 前言 在 <开发流程>中介绍了PM开发的一般流程,重点是好的模型.简单有效的接口参数.可量化的测试环境以及可独性强的输出 ...

  7. 八、Linux下的网络服务器模型

    服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器,按处理方式来分有循环服务器和并发服务器. 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提 ...

  8. Linux下select, poll和epoll IO模型的详解

    http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...

  9. (转)Linux下select, poll和epoll IO模型的详解

    Linux下select, poll和epoll IO模型的详解 原文:http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll ...

随机推荐

  1. 英语学习/词典App分析-团队作业(五)

    英语学习/词典APP排行五排名: 1.网易有道词典(单词查询翻译类软件). 2.百词斩(单词记忆类软件). 3.沪江开心词场. 4.金山词霸. 5.流利说英语(英语口语APP). 个软件的分析: 1. ...

  2. 设置macbook休眠模式

    前言: macbook默认合上盖默认是进入混合休眠模式模式(mode 3),此时电脑还会供电.不想耗电的话关机的话当前的工作状态就丢失了. macbook实际上是可以进入休眠模式的,只是没开放出来,我 ...

  3. 爆打团队 四则运算 beta视频

    爆打团队 四则运算 beta视频链接 http://v.youku.com/v_show/id_XMTU1MjAzNDI0NA==.html?from=s1.8-1-1.2

  4. mybatis之DAO层自动实现接口

    * 使用mybatis举例,使用DAO接口方式实现* 不需要针对接口去编写具体的实现类代码,编写映射XML文件,直接拿来使用即可.* 1.导入jar包:mybatis和mysql-connector* ...

  5. 用jq获取元素内文本,但不包括其子元素内的文本值的方法

    <li id="listItem"> This is some text <span id="firstSpan">First span ...

  6. 深入理解ajax系列第二篇——请求方式

    前面的话 在上一篇中,概要地介绍了XHR对象的使用.本文将详细介绍使用XHR对象发送请求的两种方式——GET和POST.下面将以实例的形式来详细说明 GET GET是最常见的请求类型,最常用于向服务器 ...

  7. iOS 给UIView添加xib

    2017-08-25编辑:这文章有点过时了 推荐新的文章:http://www.cnblogs.com/hero11223/p/6881848.html 一段时间没敲代码,以前一些简单的都不会做了,翻 ...

  8. SP1043 GSS1

    题目链接 简单说就是带修的查询区间最大子段和,用线段树维护即可 对于每个区间,我们肯定要记录它的最大子段和\(v\),但是怎么维护呢? 我们可以记录下从区间左端点开始的最大子段和\(v1\),从右端点 ...

  9. MT【185】$\max$的表示

    已知$f(x)=x^2+(a-4)x+1+|x^2-ax+1|$的最小值为$\dfrac{1}{2}$,则$a$=______ 提示:$f(x)=\max\{2(x-1)^2,2(a-2)x\}$,从 ...

  10. 洛谷P3348 [ZJOI2016]大森林(LCT,虚点,树上差分)

    洛谷题目传送门 思路分析 最简单粗暴的想法,肯定是大力LCT,每个树都来一遍link之类的操作啦(T飞就不说了) 考虑如何优化算法.如果没有1操作,肯定每个树都长一样.有了1操作,就来仔细分析一下对不 ...