当前位置: 首页 > news >正文

做弹幕网站有哪些南京网页搜索排名提升

做弹幕网站有哪些,南京网页搜索排名提升,做书的网站,吉林省安全建设网站Linux设备模型(3)_Uevent作者#xff1a;蜗蜗 发布于#xff1a;2014-3-10 20:39分类#xff1a;统一设备模型1. Uevent的功能Uevent是Kobject的一部分#xff0c;用于在Kobject状态发生改变时#xff0c;例如增加、移除等#xff0c;通知用户空间程序。用户空间程序收到…Linux设备模型(3)_Uevent作者蜗蜗 发布于2014-3-10 20:39分类统一设备模型1. Uevent的功能Uevent是Kobject的一部分用于在Kobject状态发生改变时例如增加、移除等通知用户空间程序。用户空间程序收到这样的事件后会做相应的处理。该机制通常是用来支持热拔插设备的例如U盘插入后USB相关的驱动软件会动态创建用于表示该U盘的device结构(相应的也包括其中的kobject)并告知用户空间程序为该U盘动态的创建/dev/目录下的设备节点更进一步可以通知其它的应用程序将该U盘设备mount到系统中从而动态的支持该设备。2. Uevent在kernel中的位置下面图片描述了Uevent模块在内核中的位置由此可知Uevent的机制是比较简单的设备模型中任何设备有事件需要上报时会触发Uevent提供的接口。Uevent模块准备好上报事件的格式后可以通过两个途径把事件上报到用户空间一种是通过kmod模块直接调用用户空间的可执行文件另一种是通过netlink通信机制将事件从内核空间传递给用户空间。注1有关kmod和netlink会在其它文章中描述因此本文就不再详细说明了。3. Uevent的内部逻辑解析3.1 Source Code位置Uevent的代码比较简单主要涉及kobject.h和kobject_uevent.c两个文件如下include/linux/kobject.hlib/kobject_uevent.c3.2 数据结构描述kobject.h定义了uevent相关的常量和数据结构如下kobject_action1: /* include/linux/kobject.h, line 50 */2: enum kobject_action {3:     KOBJ_ADD,4:     KOBJ_REMOVE,5:     KOBJ_CHANGE,6:     KOBJ_MOVE,7:     KOBJ_ONLINE,8:     KOBJ_OFFLINE,9:     KOBJ_MAX10: };kobject_action定义了event的类型包括ADD/REMOVEKobject(或上层数据结构)的添加/移除事件。ONLINE/OFFLINEKobject(或上层数据结构)的上线/下线事件其实是是否使能。CHANGEKobject(或上层数据结构)的状态或者内容发生改变。MOVEKobject(或上层数据结构)更改名称或者更改Parent(意味着在sysfs中更改了目录结构)。CHANGE如果设备驱动需要上报的事件不再上面事件的范围内或者是自定义的事件可以使用该event并携带相应的参数。kobj_uevent_env1: /* include/linux/kobject.h, line 31 */2: #define UEVENT_NUM_ENVP 32 /* number of env pointers */3: #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */4:5: /* include/linux/kobject.h, line 116 */6: struct kobj_uevent_env {7:     char *envp[UEVENT_NUM_ENVP];8:     int envp_idx;9:     char buf[UEVENT_BUFFER_SIZE];10:int buflen;11: };前面有提到过在利用Kmod向用户空间上报event事件时会直接执行用户空间的可执行文件。而在Linux系统可执行文件的执行依赖于环境变量因此kobj_uevent_env用于组织此次事件上报时的环境变量。envp指针数组用于保存每个环境变量的地址最多可支持的环境变量数量为UEVENT_NUM_ENVP。envp_idx用于访问环境变量指针数组的index。buf保存环境变量的buffer最大为UEVENT_BUFFER_SIZE。buflen访问buf的变量。kset_uevent_ops1: /* include/linux/kobject.h, line 123 */2: struct kset_uevent_ops {3:     int (* const filter)(struct kset *kset, struct kobject *kobj);4:     const char *(* const name)(struct kset *kset, struct kobject *kobj);5:     int (* const uevent)(struct kset *kset, struct kobject *kobj,6:                         struct kobj_uevent_env *env);7: };kset_uevent_ops是为kset量身订做的一个数据结构里面包含filter和uevent两个回调函数用处如下filter当任何Kobject需要上报uevent时它所属的kset可以通过该接口过滤阻止不希望上报的event从而达到从整体上管理的目的。name该接口可以返回kset的名称。如果一个kset没有合法的名称则其下的所有Kobject将不允许上报uventuevent当任何Kobject需要上报uevent时它所属的kset可以通过该接口统一为这些event添加环境变量。因为很多时候上报uevent时的环境变量都是相同的因此可以由kset统一处理就不需要让每个Kobject独自添加了。3.3 内部动作通过kobject.huevent模块提供了如下的API(这些API的实现是在lib/kobject_uevent.c”文件中)1: /* include/linux/kobject.h, line 206 */2: int kobject_uevent(struct kobject *kobj, enum kobject_action action);3: int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,4:                         char *envp[]);5:6: __printf(2, 3)7: int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);8:9: int kobject_action_type(const char *buf, size_t count,10:                         enum kobject_action *type);kobject_uevent_env以envp为环境变量上报一个指定action的uevent。环境变量的作用是为执行用户空间程序指定运行环境。具体动作如下查找kobj本身或者其parent是否从属于某个kset如果不是则报错返回(注2由此可以说明如果一个kobject没有加入kset是不允许上报uevent的)查看kobj-uevent_suppress是否设置如果设置则忽略所有的uevent上报并返回(注3由此可知可以通过Kobject的uevent_suppress标志管控Kobject的uevent的上报)如果所属的kset有uevent_ops-filter函数则调用该函数过滤此次上报(注4这佐证了3.2小节有关filter接口的说明kset可以通过filter接口过滤不希望上报的event从而达到整体的管理效果)判断所属的kset是否有合法的名称(称作subsystem和前期的内核版本有区别)否则不允许上报uevent分配一个用于此次上报的、存储环境变量的buffer(结果保存在env指针中)并获得该Kobject在sysfs中路径信息(用户空间软件需要依据该路径信息在sysfs中访问它)调用add_uevent_var接口(下面会介绍)将Action、路径信息、subsystem等信息添加到env指针中如果传入的envp不空则解析传入的环境变量中同样调用add_uevent_var接口添加到env指针中如果所属的kset存在uevent_ops-uevent接口调用该接口添加kset统一的环境变量到env指针根据ACTION的类型设置kobj-state_add_uevent_sent和kobj-state_remove_uevent_sent变量以记录正确的状态调用add_uevent_var接口添加格式为SEQNUM%llu”的序列号如果定义了CONFIG_NET”则使用netlink发送该uevent以uevent_helper、subsystem以及添加了标准环境变量(HOME/PATH/sbin:/bin:/usr/sbin:/usr/bin)的env指针为参数调用kmod模块提供的call_usermodehelper函数上报uevent。其中uevent_helper的内容是由内核配置项CONFIG_UEVENT_HELPER_PATH(位于./drivers/base/Kconfig)决定的(可参考lib/kobject_uevent.c, line 32)该配置项指定了一个用户空间程序(或者脚本)用于解析上报的uevent例如/sbin/hotplug”。call_usermodehelper的作用就是fork一个进程以uevent为参数执行uevent_helper。kobject_uevent和kobject_uevent_env功能一样只是没有指定任何的环境变量。add_uevent_var以格式化字符的形式(类似printf、printk等)将环境变量copy到env指针中。kobject_action_type将enum kobject_action类型的Action转换为字符串。说明怎么指定处理uevent的用户空间程序(简称uevent helper)上面介绍kobject_uevent_env的内部动作时有提到Uevent模块通过Kmod上报Uevent时会通过call_usermodehelper函数调用用户空间的可执行文件(或者脚本简称uevent helper )处理该event。而该uevent helper的路径保存在uevent_helper数组中。可以在编译内核时通过CONFIG_UEVENT_HELPER_PATH配置项静态指定uevent helper。但这种方式会为每个event fork一个进程随着内核支持的设备数量的增多这种方式在系统启动时将会是致命的(可以导致内存溢出等)。因此只有在早期的内核版本中会使用这种方式现在内核不再推荐使用该方式。因此内核编译时需要把该配置项留空。在系统启动后大部分的设备已经ready可以根据需要重新指定一个uevent helper以便检测系统运行过程中的热拔插事件。这可以通过把helper的路径写入到/sys/kernel/uevent_helper”文件中实现。实际上内核通过sysfs文件系统的形式将uevent_helper数组开放到用户空间供用户空间程序修改访问具体可参考./kernel/ksysfs.c”中相应的代码这里不再详细描述。原创文章转发请注明出处。蜗窝科技www.wowotech.net。评论2014-12-02 12:01之前一直以为uevent_ops-uevent是完成具体的事件上报函数回调误解为就是wowo开始所说的uevent机制。看了这篇文章和代码才知道这个callback的作用只是添加一个环境变量名字比较迷惑人。另外整个kernel中鲜有利用uevent的场景所以uevent其实用处不大更有用的是uevent_ops-filter回调。说起环境变量上报搞不清楚上报这些个环境变量的用处是什么如果是上报Kobject在sysfs中路径信息倒是好理解至于环境变量用户空间处理程序(hotplug什么的)的执行需要上报的这些环境变量吗wowo2014-12-02 13:27puppypyb其实环境变量是使用usermodehelper的方式处理uevent时才会需要如果使用的netlink的话确实不需要。环境变量存在的本质是因为exec系列的“文件执行”函数需要(这也是Linux下文件执行的基础)这可以从do_execve(fs/exec.c)接口从看出int do_execve(const char *filename,const char __user *const __user *__argv,const char __user *const __user *__envp)至于kernel中uevent用处还真不好说。如果你需要一些例子的话可以去看看Android的switch class(drivers/switch/)。我的观点是如果软件设计的足够好一定用不到ueventpoll机制足够了。如果poll解决不了则说明设计者根本不知道event要上报给谁才使用uevent的方式随便一扔谁想收就收吧。另外无论是usermodehelper还是netlink的方式uevent对系统性能是有影响的。特别是netlink的方式上报的event会通知到所有的用户进程所以还是少用为妙。2014-12-02 14:27wowounderstood, thanks~2014-10-28 23:10注1有关kmod和netlink会在其它文章中描述因此本文就不再详细说明了。这两个在哪讲啊 啊2014-10-28 23:17xxx不好意思还没有来得及写…
http://www.pierceye.com/news/115475/

相关文章:

  • 建站系统wordpress下载哪个公司的微信商城系统
  • 网站建设app开发合同深圳企业网站制作设计方案
  • 免费网站整站模板下载寻找做网站
  • 做此广告的网站做家纺的网站
  • 湖南畅想网站建设个人网站建设基本定位
  • 建站公司外包钓鱼网站怎么做
  • 个人网站logo需要备案吗鑫灵锐做网站多少钱
  • .xyz做网站怎么样网站产品预算
  • 建网站先要申请网址吗做网站给文件不侵权
  • 一元夺宝网站建设Wordpress 普通图片裁剪
  • 网站推广都有哪些自己有网站怎么优化
  • 宠物交易网站模板更改wordpress后台登录地址
  • 有电脑网站怎样建手机正规网络游戏平台
  • 网站抓取QQ获取系统cms监控手机客户端
  • 郑州网站推广价格优礼品网站模板
  • 百度指数不高的网站怎么优化网站图片类型
  • 北京专业做网站怎么样app软件开发摄像头
  • 网站建设导向erp系统软件免费版
  • 手表网站网站开发毕业设计文献综述
  • 台州网站制作维护关于微网站策划ppt怎么做
  • 网站建设中期目标开发app找那个公司
  • 跨境自建站模板网站内容和功能清单
  • 平面设计找素材的网站电子商务网站建设的步骤一般为(
  • 一个服务器可以备案几个网站凡科门店通怎么样
  • 房地产企业网站建设想给公司产品做个推广
  • 国外网站平台wordpress电脑安装教程
  • 网站开发合肥诚聘网站开发人员
  • 网站开发者模式怎么保存网站首页调用网站标题
  • 仿京东网站模板wordpress单页视差
  • php mysql 网站建设html5手机网站模板