Udev 内核机制(kobject_uevent) 性能优化 .
来源:互联网 发布:mysql for windows 10 编辑:程序博客网 时间:2024/05/16 14:05
http://blog.csdn.net/zjujoe/article/details/2986634
Udev内核机制(kobject_uevent)性能优化
作者:zjujoe转载请注明出处
Email:zjujoe@yahoo.com
前言
这两天遇到一些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 PATHACTION 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.
实践证明系统运行良好。
udev参考文档
Writing udev rules
http://reactivated.net/writing_udev_rules.html
udev文件系统的使用和基本工作原理分析
http://blog.csdn.net/colorant/archive/2008/01/09/2031721.aspx
udev的实现原理
http://blog.csdn.net/absurd/archive/2007/04/27/1587938.aspx
- Udev 内核机制(kobject_uevent) 性能优化
- Udev 内核机制(kobject_uevent) 性能优化
- Udev 内核机制(kobject_uevent) 性能优化
- Udev 内核机制(kobject_uevent) 性能优化
- Udev 内核机制(kobject_uevent) 性能优化 .
- Udev 内核机制(kobject_uevent) 性能优化
- Udev 内核机制(kobject_uevent) 性能优化
- Udev 内核机制(kobject_uevent) 性能优化(转载)
- kobject_uevent
- Lnux2.6内核udev机制(基于2.6.26
- Lnux2.6内核udev机制(基于2.6.26
- tableView 性能优化机制
- Nginx性能优化----内核篇
- kernel-2.6.38内核驱动globalmem--添加中断机制和udev机制
- linux udev 机制
- Android性能优化--listview 优化机制
- Android性能优化--listview 优化机制
- 淘宝内核对LVS的性能优化
- 297 - Quadtrees
- 崇启大桥崇明段发生重大交通事故致5人死亡-重大交通事故-崇启大桥
- 通信协议之点阵的解析和showWindow问题的解决
- error: failed to launch /Users/padsoftware/Library/Developer/Xcode/DerivedDat
- Does Java pass by reference or pass by value?
- Udev 内核机制(kobject_uevent) 性能优化 .
- 自定义Dialog动画
- wince dat文件
- 【动态规划】分配小组
- ldd3 sbull编译遇到的问题 解决(部分)方法
- JAVA 实现36进制转换数字 超级简单方法……
- 淘宝数据魔方技术架构解析
- 在C语言的宏中使用类型关键字
- java学习书籍推荐(转)