`
xitong
  • 浏览: 6188884 次
文章分类
社区版块
存档分类
最新评论

Udev 内核机制(kobject_uevent) 性能优化

 
阅读更多

前言

这两天遇到一些udev的问题, 顺便阅读了一下文档(见参考文档), 基本了解了udev的机制。嵌入式系统性能很重要,于是对内核这一块进行了性能方面的研究。

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

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

kobject_uevent_env调用流程 (内核版本2.6.21

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

性能数据统计

我们通过高精度定时器(一个3.25Mtimer)来统计kobject_uevent的时间花费:

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

优化方案:

考虑到:

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

我们可以:

  1. 删除调用/sbin/hotplug的代码
  2. 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

分享到:
评论

相关推荐

    go-udev:Golang中简单的udev实现

    该库允许侦听和管理到用户空间Linux内核(自2.6.10版本开始)Netlink消息(即:NETLINK_KOBJECT_UEVENT)。 像一样,您将可以监视,显示和管理连接到系统的设备。如何获取资源 go get github.com/pilebones/go-udev...

    UDEV 流程图 uevent

    UDEV 流程图 uevent 描叙了udev检测到uevent后,超找规则,在按照规则进行操作的过程

    udev-182 库源码下载

    与传统的顺序加载相比,udev 通过并行加载内核模块提供了潜在的性能优势。并行加载模块也有一个缺点:无法保证每次加载模块的顺序,如果存在多个块设备,那么它们的设备节点可能随机变化。例如如果有两个硬盘, /dev...

    编写udev规则中文版-writing_udev_rules

    该文档是writing_udev_rules文档的中文翻译文档,对udev规则感兴趣的朋友学习

    ubuntu_udev_rules_4_android:适用于 Android 设备的 ubuntu udev 规则

    ubuntu_udev_rules_4_android 适用于 Android 设备的 ubuntu udev 规则这是 Ubuntu Linux 识别新 Android 设备所需的 udev 规则。 最初复制自 AOSP 源。 因为我有很多设备,所以我更方便地存档这个文件,这样我就...

    编译好arm平台下的libudev库

    此资源是编译好arm平台下的libudev库,便于直接开发usb驱动使用。非常的方便,省的重新编译和交叉编译。需要的人可以偷懒一下。

    Linux device-mapper-udev-CRS-ASM_v3.6.pdf

    Linux device-mapper-udev-CRS-ASM

    Writing_udev_rules.tar.gz

    这个压缩包里面是写udev规则的说明,包含了两个pdf,一个是它的英文原版,一个是翻译后的中文版本。里面介绍了udev相关的信息。例如:KERNEL、NAME、SYMLINK等关键字。

    udev_wing基础

    udev创建一个兼容设备参考,udev无论类型和连接总线创建一个附属的CD符号链接,例如 /dev/cdrom。/dev/cdom是由udev参考附属的CD兼容驱动器创建的一个符号链接,CD兼容驱动器可以是 CD-ROM,DVD-ROM,DVD-RW 等等,...

    udev_150源码包

    udev_150源码包,含path_id源码

    systemd-udev-239-45.el8.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    第15章 RAC稳定性与性能优化 15.1服务器硬件 15.1.1 Firmware固件升级 15.1.2硬件设备兼容性 15.1.3 FC HBA卡冗余 15.1.4 Infiniband技术 15.1.5 RAC硬件结构案例 15.2操作系统 15.2.1认证操作系统 15.2.2...

    qt5.9.8的USB键鼠热插拔源码修改.tar.gz

    QT5.9.8鼠标键盘热插拔默认情况是使用udev进行热插拔的,但很多情况下嵌入式系统udev配置不完整, 可能需要systemd里面的udev组件才能正常工作 鉴于此,参考网上的朋友的修改例子,不使用udev也能正常检测键鼠热插...

    linux用户空间程序udev使用总结

    udev是linux kernel的设备管理器,在内核版本中kernel_3.10开始的版本中,使用udev已经代替了以前devfs、hotplug等功能,意味着它要处理添加/删除硬件时,所有的用户空间行为。

    掌握udev 掌握udev

    掌握udev 掌握udev 掌握udev

    智能汽车竞赛室外光电竞速创意赛

    配置小车串口udev: cd ~/racecar/src/art_racecar/udev sudo bash art_init.sh sudo reboot 建立地图 先安装电脑用户名和主机名配置主从机 a) 运行车 roslaunch art_racecar Run_car.launch b) 3.3运行gmapping ...

    linux下udev的使用

    适用与海思平台下udev使用u盘的自动挂载,自动卸载功能

    suse使用udev管理asm.docx

    suse使用udev管理asm

    udev的升级包,防止udev漏洞取得root权限

    用udev的升级包,可以防止利用udev的漏洞非法取得root权限。

    linux设备文件系统——udev程序详解

    后来,采用了devfs,一个基于内核的动态设备文件系统,他首次出现在2.3.46 内核中。Mandrake,Gentoo等Linux分发版本采用了这种方式。devfs创建的设备文件是动态的。但是devfs有一些严重的限制,从 2.6.13版本后移走...

Global site tag (gtag.js) - Google Analytics