zoukankan      html  css  js  c++  java
  • linux udev 机制【转】

    本文转载自:http://blog.csdn.net/yyt8yyt8/article/details/8020154

    1. Linux的热插拔事件由kernel通过中断发现(比如,USB设备插入系统时,usb host会检测到这一事件,然后向CPU发送中断请求,并获取该usb设备的信息,usb core会根据usb id来匹配调用一个合适的usb driver处理该usb设备),然后kobject_add需要为用户空间添加信息(通过sysfs文件系统实现。sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可通过修改sysfs中的文件属性来修改设备的属性值),然后内核调用kobject_uevent函数发送netlink message给用户空间(Kobject创建和移除的时候都会发送相应add和remove消息,当然前提是您在内核中配置了hotplug的支持)。

    2. udevd收到netlink message后查找规则处理。例如,udevd的规则如下:

    60-fprint-autosuspend.rules  60-raw.rules                 90-alsa.rules                91-drm-modeset.rules
    60-pcmcia.rules              70-persistent-net.rules      90-hal.rules                 98-kexec.rules

    其中90-hal.rules是用来让udev把设备插入/拔除的事件通过socket socket:/org/freedesktop/hal/udev_event转发给HAL。

    3. HAL挂在socket:/org/freedesktop/hal/udev_event上等待事件,有事件发生时就调用函数hald_udev_data处理,它先从事件中取出主要参数,创建hotplug_event对象,把它放入事件队列中,然后调用hotplug_event_process_queue处理事件。

    函数hotplug_event_begin负责具体事件的处理,它把全部事件分为四类,并分别处理hotplug_event_begin_sysfs处理普通设备事件,hotplug_event_begin_acpi处理ACPI事件,hotplug_event_begin_apm处理APM事件,hotplug_event_begin_pmu处理PMU事件。要注意的是,后三者的事件源并非源于udev,而是在device_reprobe时触发的(osspec_device_reprobe/hotplug_reprobe_tree/hotplug_reprobe_generate_add_events/acpi_generate_add_hotplug_event)。

    函数hotplug_event_begin_sysfs中,如果是插入设备,则创建一个设备对象,设置设备的属性,调用相关callouts,然后放入设备列表中,并触发signal让dbus通知相关应用程序。如果是拔除设备,则调用相关callouts,然后从设备列表中删除,并触发signal让dbus通知相关应用程序。

    4.应用程序可以主动调用HAL提供的DBUS接口函数,这些函数在libhal.h中有定义。应用程序也可以注册HAL的signal,当设备变化时,HAL通过DBUS上报事件给应用程序。

  • 相关阅读:
    在WPF中应用弱事件模式
    MSTest DeploymentItemAttribute
    delegate, event
    zookeeper 开机启动197
    centos 7 安装solr7.3.0 配置mysql197
    solr7.4 centos7安装197
    centos 查看mysql数据库命令197
    bootstrapValidator验证197
    idea快捷键197
    sun.misc.Unsafe.park(Native Method)197
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7364203.html
Copyright © 2011-2022 走看看