kobject_uevent

Linux kernel -- Uevent发送(热插拔)事件到用户空间 Uevent是一种在内核空间和用户空间之间通信的机制,主要用于热插拔事件(hotplug)。uevent事件根据include/linux/kobject.h中的定义,uevent事件可分为以下几种:enum kobject_action { KOBJ_ADD, KOBJ_REMOVE, KOBJ_CHANGE, KOBJ_MOVE, KOBJ_ONLINE, 阅读详情
前言
这两天遇到一些 udev 的问题, 顺便阅读了一下文档(见参考文档), 基本了解了 udev的机制。嵌入式系统性能很重要,于是对内核这一块进行了性能方面的研究。

内核大概20多处会调用了 kobject_uevent 函数发送 KOBJ_ADD / KOBJ_REMOVE等事件。其中我们最关心的就是在device_add/device_del 中向用户空间发送设备的添加、删除信息。

kobject_uevent 直接调用 kobject_uevent_env 函数完成功能,我们先分析一下该函数的流程。

kobject_uevent_env调用流程 (内核版本 2.6.21)
kobject_uevent_env首先搜索 kobject 所属的 kset,获得kset->uevent_ops,类型为kset_uevent_ops(系统一共有block_uevent_ops memory_uevent_ops device_uevent_ops class_uevent_ops  module_uevent_ops )这几大类kset_uevent_ops,我们这里主要看device_uevent_ops。
如果 uevent_ops 有 filter 成员函数, 则调用该函数,如果filter函数返回非0,则失败,结束流程。device_uevent_ops 的 filter函数为dev_uevent_filter, 它的过滤条件为该设备的总线(bus) 或者类 (class) 非空。
为 envp分配一个大小为  32 的数组, 用于存储环境变量指针,为 buffer 分配一个大小为2048 的数组,用于存储环境变量内容。
初始化环境变量, 包括 HOME PATH ACTION DEVPATH SUBSYSTEM 等
如果 uevent_ops 有 uevent 函数,则调用该函数,如果uevent函数返回非0,则失败,结束流程。device_uevent_ops 的 uevent函数为dev_uevent,它的流程为:
添加主次设备号到环境变量
添加 driver 的名称到环境变量
如果设备所属总线 (dev->bus)有 uevent函数, 则调用它。如失败,结束流程
如果设备所属类 (dev->class)有 uevent函数,则调用它。如失败,结束流程。(象函数_request_firmware()中,有两次调用kobject_uevent函数,其中第一次在class 的 uevent函数firmware_uevent中,测试FW_STATUS_READY位失败而返回)。
如果设备所属类型 (dev->type)有 uevent函数, 则调用它。如失败,结束流程.(搜索了一下, 这个field 在整个内核里基本没有使用)
注意每个 uevent 函数都有机会添加环境变量以及出错返回,结束uevent传递。
递增 uevent 序列号uevent_seqnum(可以通过 cat /sys/kernel/uevent_seqnum查看)。
如果定义了 CONFIG_NET 通过 netlink 将事件以及环境变量发送出去。
如果uevent_helper 非空, 则调用该函数。uevent_helper 的缺省值为: "/sbin/hotplug"应该在用户层调用:echo "" > /sys/kernel/uevent_helper来取消该此调用。
性能数据统计
我们通过高精度定时器(一个 3.25M 的timer)来统计 kobject_uevent 的时间花费:

还没有进入用户空间时,内核调用了 kobject_uevent 244次, 平均每次 289us,总共70ms(由于每次需要调用并不存在的 /sbin/hotplug, 时间比较长。
进入用户空间后,调用  udevtrigger, 开始15次 kobject_uevent调用平均每次 6249us, 总共93ms (很奇怪,需要深入研究一下)。
然后 181 次 kobject_uevent 调用平均每次 47us, 总共 8ms。
优化方案:
考虑到:

还没有进入用户空间时发出的 uevent看似丢失了!可以不发出
/sbin/hotplug 在使用 netlink 时永远没有必要调用!可以删除
我们可以:

删除调用/sbin/hotplug的代码
在uevent_helper 非空时不真正发出 uevent
这样,在进入用户空间之前,我们的uevent机制不会做任何事情,只有用户空间调用

echo "" > /sys/kernel/uevent_helper

后, uevent 才会被真正发送到netlink.

Linux kobject_uevent_env通知应用层事件方法 阅读详情

相关推荐

uevent & netlink(KOBJECT_UEVENT)

uevent /android/system/core/libcutils/uevent.c uevent 是通过netlink socket发送消息给用户进程 android/system/extras/tests/uevents ./uevents change@/devices/platform/disp ACTIO...

gbmaotai的博客 3825

kobject之kobject_uevent.c文件分析

struct      kset_uevent_ops {        int                 (*filter)(struct kset *kset, struct kobject *kobj);          //过滤函数,kset中的kobj是否需要

秋水三尺尘不染 4907

linux kobject-uevent(热插拔事件)

sysfs文件系统主要功能是将系统中所有的设备通过一个拓扑结构全部展示出来,在系统启动的初期,系统通过mount命令将syfs文件系统挂载到/sys节点上, mount-tsysfssysfs/sys 通过sys节点将系统中所有的设备展示出来,同时设备的属性等可以通过该文件系统进行交互,所以作用有下面三点: 建立系统中总线、驱动、设备三者之间的桥梁 像用户空间展示内核中各种设备的拓扑图 提供给用户空间对设备获取信息和操作的接口,部分取代ioctl功能。 而kobject是sysfs的基...

weixin_42730667的博客 5557

Linux kobject_uevent_env

简述 kobject_uevent_env用于Linux下热插拔事件产生时,通知到用户空间的一种方式,uevent是sysfs向用户空间发出的消息。 基本结构 // kobject事件类型 // 源码位置/kernel/msm-3.18/include/linux/kobject.h enum kobject_action { KOBJ_ADD, KOBJ_REMOVE, KOBJ_CHANGE, KOBJ_MOVE, KOBJ_ONLINE, KOBJ_OFFLINE, KOBJ_M

spongebob1912的博客 6774

简要分析NETLINK_KOBJECT_UEVENT参数

NETLINK_KOBJECT_UEVENT是Linux设备热插拔管理的基石,支撑了动态设备管理的自动化关键角色:内核:生成事件消息用户空间服务(如udev):解析事件并响应。适用场景:开发设备监控工具调试设备驱动或热插拔问题构建自定义设备管理逻辑(如容器允许时挂载设备)

weixin_41123217的博客 1651

LabVIEW调用.so文件的方法

LabVIEW调用.so文件的方法

m0_37878912的博客 3022

【linux kernel】一文总结linux的uevent机制

本文描述linux内核的uevent机制。

iriczhao的博客 3413

MS1826A HDMI 多功能视频处理器 HDMI4进1出画面分割芯片

基本介绍 MS1826A 是一款多功能视频处理器,包含 4 路独立 HDMI 音视频输入通道、1 路 HDMI 音视 频输出通道以及 1 路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字库定 制型 OSD;可处理隔行和逐行视频或者图形输入信号;有四路独立视频播放引擎可支持视频多路 播放。该产品提供了高质量的视频输出,有解隔行输入、视频增强,以及帧率转换的处理能力。 功能特征 视频输入输出  四路独立 HDMI 输入通道  一路 HDMI 输出通道  最高支持 4K@3

qq_45645383的博客 1779

uevent之kobject_uevent_env

定义 kobject_uevent_env函数:

chengbeng1745的博客 3258

GR00TN1.7国内本地下载+模型下在+hugingface无法连接,本地模型下载

GR00TN1.7

alsj123456的博客 97

Hexo博客使用PDF.js

clone了一个pdf.js 然后兴高采烈地到文章里使用{% pdf %}标签 结果浏览器弹出了个下载框(使用GitHub的raw) 不知道是不是因为使用GitHub的原因导致这个问题 后来我测试的时候报了个错 优快云上的解决方法 到时候我再试试把资源放回lib/里面看看行不行 目录1.clone1.1.官方方法1.2.NexT主题方法1.3.补充2.修改文件2.1.修改viewer.htm...

LTFan 961

kobject和uevent的一点想法--待续

文件路径: include/linux/kobject.h lib/kobject_uevent.c lib/kobject.c   在我的理解中uevent事件和kobject绑定在一起的   几种kobject能够产生的事件属性 enumkobject_action { KOBJ_ADD,//添加 KOBJ_REMOVE,//移除 KOBJ_CHANGE,//发生了变化 ...

jeremy_fan的博客 704

Ecg信号QRS波峰检测:A Real-Time QRS Detection Algorithm (Pan-Tompkins法)

Pan-Tompkins法是R峰检测的经典方法,被引量高达6000+次。 Pan J, Tompkins W J. A real-time QRS detection algorithm[J]. IEEE transactions on biomedical engineering, 1985 (3): 230-236. 本文对论文流程进行了总结,并参考BioSigKit项目,复现了论文代码。 流程图: 代码如下: 第一部分是信号读入,这里使用MIT_BIH信号的100,读入10000个数据点 第二部分

weixin_42870380的博客 1万+

详解kobject_uevent_env上报机制

在用户层,通过一个进程来创建一个netlink,这个应用程序可以是mdev,udev或者openwrt的procd,这三种方式都是基于netlink来管理热插拔的,比如procd通过NETLINK_KOBJECT_UEVENT参数来通过socket系统调用创建一个fd来与内核的netlink交互数据,内核上报uevent被这个进程接受后,然后调用/etc/hotplug.d/的各脚本来执行热插拔操作。这是热插拔触后,触发的事件给应用层,然后执行的脚本,跟上面的信息是对上的。比如插拔sim卡会打印如下信息。

我的博客 1802

SAP成本核算变式OKKN配置详解:从CK11N到CK24,手把手教你搞定标准成本发布

本文深入解析SAP成本核算变式OKKN的配置原理与实战应用,涵盖从CK11N到CK24的标准成本发布全流程。详细讲解数量结构控制、价值结构配置及间接费用计算规则,帮助成本会计精准掌握标准成本计算逻辑,解决BOM版本选择、工艺路线获取等常见问题,提升企业成本管理效率。

weixin_27219587的博客 284

heygem本地部署报错:SQLite3 can only bind numbers, strings, bigints, buffers, and null...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位大厂资深架构师和一线开发多年实战经验沉淀,

**My Coding Family** 3246

linux下热插拔事件的产生是怎样通知到用户空间,kobject_uevent_env之uevent

1.kobject, ktype, kset kobject代表sysfs中的目录。 ktype代表kobject的类型,主要包含release函数和attr的读写函数。比如,所有的bus都有同一个bus_type;所有的class都有同一个class_type。 kset包含了subsystem概念,kset本身也是一个kobject,所以里面包含了一个kobject对象。另外

bingqingsuimeng的专栏 2万+

【MATLAB】STM32电机调速闭环控制工程

本文提出了一种基于MATLAB仿真与STM32实现的直流电机闭环PID调速控制方案。通过MATLAB建立电机数学模型并进行参数整定,仿真验证了增量式PID算法在启停、稳态和抗扰动方面的优越性能。基于STM32F103搭建了硬件系统,实现了编码器测速、定时中断控制、PWM输出等功能。实测表明,该系统转速超调<2%、稳态误差±2r/min,具备快速响应和强抗扰能力。相比开环控制,闭环调速显著提升了动态性能和稳态精度。方案提供了完整的仿真代码和嵌入式工程源码,可直接应用于智能小车、工业传动等场景,具有较高的

unber的博客 49

嵌入式 linux下kernel中kobject之kobject_uevent.c文件分析

struct      kset_uevent_ops {        int                 (*filter)(struct kset *kset, struct kobject *kobj);          //过滤函数,kset中的kobj是否需要处理        const char      *(*name)(struct kset *kset, struc

skdkjxy的专栏 963

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux 内核uevent事件,Udev 内核机制(kobject_uevent) 性能优化

Udev 内核机制(kobject_uevent) 性能优化前言这两天遇到一些 udev 的问题, 顺便阅读了一下文档(见参考文档), 基本了解了 udev的机制。嵌入式系统性能很重要,于是对内核这一块进行了性能方面的研究。内核大概20多处会调用了 kobject_uevent 函数发送 KOBJ_ADD / KOBJ_REMOVE等事件。其中我们最关心的就是在device_add/device_...

weixin_30400859的博客 660

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Linux内核kobject事件通知:uevent机制深度解析与实战

你是否好奇当插入U盘时,Linux系统如何自动识别并挂载设备?当硬件状态发生变化时,驱动程序如何通知用户空间应用?这些场景背后,**kobject uevent(用户事件)机制**扮演着关键角色。作为Linux内核中连接内核对象与用户空间的核心通信通道,uevent机制实现了设备状态变化、驱动加载等事件的实时通知,是udev、systemd-udevd等设备管理工具的底层支撑。 本文将系统剖析u...

gitblog_01071的博客 676

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 面向对象语言的多态性问题
下一篇: android repo学习
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值