2011-7-29 12:31:18

来源:互联网 发布:北大青鸟java学费多少 编辑:程序博客网 时间:2024/05/20 10:53
 

 

 

2011-7-29 12:31:18

核和应用程序见的通信通道就是 udev,hal。 udev 只是一个框架,它的行为完全受它的规则所控制,这些规则存放在目录 /etc/udev/rules.d/ 中。udev 通过 NetLink

注册内核的设备事件,当有设备插入 / 拔除时,udev 就会收到内核的通知,然后它会从事件中所带参数和 sysfs 中的信息加载适当的驱动程序,创建 dev 下的结点,
让设备处于可用的状态,最后通知 hal。

HAL 等待 udev 报告事件,有事件发生时就处理。如果是插入设备,则创建一个设备对象,设置设备的属性,调用相关callouts,然后放入设备列表中,并触发 signal 让 dbus

 通知相关应用程序。如果是拔除设备,则调用相关callouts,然后从设备列表中删除,并触发signal让 dbus通知相关应用程序。应用程序也可以主动调用HAL提供的DBUS接口函数,
 
 这些函数在libhal.h中有定义。应用程序也可以注册HAL的signal,当设备变化时,HAL通过DBUS上报事件给应用程序。

大概的流程就是:
_____________________________________________________
App                          App等候设备处理信息并执行相应操作

D-Bus                       用户空间消息总线系统

HAL                          过滤处理内容后送给D-Bus
↑                                     它是一个位于操作系统和驱动程序之上,
↑                                     运行在用户空间中的服务程序
udev                         把硬件相关内容送到HAL
↑                                      kernel2.6发现设备变化反映到sysfs,
↑                                      并通过hotplug机制通知udev
Linux Kernel2.6        内核自动调用驱动模块

————————————————————————-


例如您插入了一个 u盘,内核探测到硬件,加载驱动,然后通知 udev;udev 把硬件相关信息发送给 hal;hal 描述硬件用法、特性、类型、能力,发送给 dbus;最后

bus 通知相关程序,这时候您就可以看到 gnome 自动挂载了您的 u盘,并让您选择是以 nautilus 浏览文件,还是 smplayer 播放媒体 —— 这背后的一切,都是在您不知不觉中完成的。

内核也可以直接传递信息给 hal ,方式有两种: callout 和 addon 。前者在设备 插入/拔除 时候响应;后者处理没有 hotplug 的事件,如光驱状态,电源管理等。