D-Bus 是针对桌面环境优化的 IPC(Inter-Process Communication,进程间通信)机制,用于进程间的通信或进程与内核的通信。最基本的 D-Bus 协议是一对一的通信协议。但在很多情况下,通信的一方是消息总线。消息总线是一个特殊的应用,它同时与多个应用通信,并在应用之间传递消息。下面我们会在实例中观察消息总线的作用。消息总线的角色有点类似与X系统中的窗口管理器,窗口管理器既是X客户,又负责管理窗口。
  支持 D-Bus 的系统都有两个标准的消息总线:系统总线和会话总线。系统总线用于系统与应用的通信;会话总线用于应用之间的通信。
  如果应用程序使用了 libdbus 就能够接收到来自内核的有关硬件热插拔的通知,比如U盘的插入和拔出。那么,其中经过了怎样的过程呢。
  首先,udev 通过 NetLink 注册内核的设备事件,当有设备插入/拔除时,udev 就会收到通知,它会从事件中所带参数和 sysfs 中的信息,加载适当的驱动程序(也可以通过 hald 去运行应用程序让用户选择可用的驱动),创建 dev 下的结点,让设备处于可用的状态。
  接着,dev 把设备插入/拔除的事件通过 socket:/org/freedesktop/hal/udev_event 转发给 HALD 的。
  然后,HALD 挂在 socket:/org/freedesktop/hal/udev_event 上等待事件,有事件发生时就调用相关函数处理,它先从事件中取出主要参数,创建一个 hotplug_event 对象,把它放入事件队列中,创建一个设备对象,设置设备的属性,调用相关 callouts,然后放入设备列表中,并触发 signal 让 dbus 通知相关应用程序。如果是拔除设备,则调用相关 callouts,然后从设备列表中删除,并触发 signal 让 dbus 通知相关应用程序。

  hal(hardware abstract lever)硬件抽象。Linux 的 hal 运行于用户空间作为一个 daemon 进程。监听一个 socket 接口。等待 udev 发来的通知。 udev 为设备加载驱动,设备可用后,往往有 udev 的规则,让 udev 通知 hald 表示设备变动了。 hal 作为一个硬件的数据库,记录了硬件的属性,当前硬件有哪些,他们的属性是什么,等等信息。 因而,用户态程序可以查询hald得到硬件的信息。也可以注册监听事件在 hald 上面。当监听的硬件事件发生时候,hald 会通知他们。

说明:
  1、实线箭头为主动调用,虚线箭头为事件上报。
  2、udev 通过 NetLink 注册内核的设备事件,当有设备插入/拔除时,udev 就会收到通知,它会从事件中所带参数和 sysfs 中的信息,加载适当的驱动程序,创建 dev 下的结点,让设备处于可用的状态。
  3、udev 只是一个框架,它的行为完全受它的规则所控制,这些规则存放在目录 /etc/udev/rules.d/中,其中 90-hal.rules 是用来让 udev 把设备插入/拔除的事件通过socket:/org/freedesktop/hal/udev_event 转发给 HAL 的。
  4、HAL 挂在 socket:/org/freedesktop/hal/udev_event 上等待事件,有事件发生时就调用函数 hald_udev_data 处理,它先从事件中取出主要参数,创建一个 hotplug_event 对象,把它放入事件队列中,然后调用 hotplug_event_process_queue 处理事件。
  5、函数 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)。
  6、函数 hotplug_event_begin_sysfs 中,如果是插入设备,则创建一个设备对象,设置设备的属性,调用相关 callouts,然后放入设备列表中,并触发 signal 让 dbus 通知相关应用程序。如果是拔除设备,则调用相关 callouts,然后从设备列表中删除,并触发 signal 让 dbus 通知相关应用程序。
  7、应用程序可以主动调用 HAL 提供的 DBUS 接口函数,这些函数在 libhal.h 中有定义。应用程序也可以注册 HAL 的 signal,当设备变化时,HAL 通过 DBUS 上报事件给应用程序。
  8、callout 是 HAL 一种扩展方式,它在设备插入/拔除时执行。可以在设备信息文件中(/usr/share/hal 目录)指定。
  9、addon 也是 HAL 一种扩展方式,它与 callout 的不同之处在于 addon 往往是事件的触发者,而不是事件的消费者。HAL 的事件源主要源于 udev,而 udev 源于 kernel 的 hotplug,然而有的设备如电源设备、磁盘设备和特殊按键等,它们并不产生 hotplug 事件。HAL 就得不到通知,怎么办呢,addon 就是用于支持新事件源的扩展方式。比如 addon-acpi 从 /proc/acpi/event 或者 /var/run/acpid.socket 收到事件,然后转发成 HAL 事件。addon-storage 检测光盘或磁盘的状态,并设置设备的属性。addon-keyboard 检测一些特殊按键,并触发相应事件。
(access-check/ci-tracker/ck-tracker 负责权限的检查,里面提到的 PolicyKit/ConsoleKit 不是太熟悉,有时间再看看。)
  简单的说,HAL 就是一个设备数据库,它管理当前系统中所有的设备,你可以以多种灵活的方式去查询这些设备,可以获取指定设备的特性,可以注册设备变化事件。

Hal的功能:
  1、获取指定类型的设备列表。
  2、获取/更改设备的属性值。
  3、获取设备具有的能力描述。
  4、设备插入/拔除时,通知相关应用程序。
  5、设备属性或能力变化时,通知相关应用程序。


参考文章:
【1】 http://www.linuxidc.com/Linux/2011-01/31238.htm
【2】 http://blog.csdn.net/faithsws/article/details/5380710

浅谈 D-Bus、udevd 和 hald相关推荐

  1. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  2. 父子组建传值_浅谈Vue父子组件和非父子组件传值问题

    本文介绍了浅谈Vue父子组件和非父子组件传值问题,分享给大家,具体如下: 1.如何创建组件 1.新建一个组件,如:在goods文件夹下新建goodsList.vue goodsList组件 expor ...

  3. 车载网络与计算机网络有什么不同,浅谈汽车车载网络的应用

    浅谈汽车车载网络的应用 作者:段春艳 出处:论文网 时间:2007-01-10 摘 要:车载网络是现代汽车电子技术发展的必然趋势,本文就车载网络形成的必要性及其应用进行了系统地分析,以便更好地理解新一 ...

  4. CAN诊断浅谈 如何用CAN工具进行诊断

    转:https://mp.weixin.qq.com/s/bcuoUQfkfyx6rtbgw-Z_BQ 引言: 从之前的课程我们了解到, 车上的智能硬件设备太多, 即ECU节点太多, 这些节点通过CA ...

  5. 嘴哥有料系列-can工具1:CAN诊断浅谈 + 如何用CAN工具进行诊断

    原文章:https://mp.weixin.qq.com/s/bcuoUQfkfyx6rtbgw-Z_BQ 引言: 从之前的课程我们了解到, 车上的智能硬件设备太多, 即ECU节点太多, 这些节点通过 ...

  6. 浅谈Linux PCI设备驱动(二)

    我们在浅谈Linux PCI设备驱动(一)中(以下简称浅谈(一) )介绍了PCI的配置寄存器组,而Linux PCI初始化就是使用了这些寄存器来进行的.后面我们会举个例子来说明Linux PCI设备驱 ...

  7. 《浅谈Cache Memory》 学习-第一章

    序 近些年,我在阅读一些和处理器相关的论文与书籍,有很多些体会,留下了若干文字.其中还是有一片领域,我一直不愿意书写,这片领域是处理器系统中的Cache Memory.我最后决定能够写下一段文字,不仅 ...

  8. 浅谈服务治理、微服务与服务网格(Service Mesh)

    浅谈服务治理.微服务与Service Mesh Spring Cloud 之"出身名门望族" 作为当下最火热的微服务框架,Spring Cloud的名字可以说是无人不知.无人不晓, ...

  9. 浅谈Linux media framework

    基本概念 通过调试camera过程中对接触的v4l2,意外发现了Linux一个不是很起眼的子系统--Linux media framework,那它存在的意义是什么? 节选一段来自Linux源码中的文 ...

最新文章

  1. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...
  2. 139邮箱发送邮件时候,zmail.server(from_mail,pwd) 该pwd可以不用是授权码,是密码就可以
  3. 结构型模式之Adapter模式
  4. 数字图像处理:第十章 离散图象变换
  5. 回退进度_【蜕变】V7账号发展进度第47期:回归宝箱开个都是啥呀!瞬间无爱了...
  6. const 作用 c语言,在C语言中const 作用的的全面总结.doc
  7. 【Python金融量化 6- 100 】、六、蒙特卡洛预测微软股票
  8. pcb设计单点接地示意图_答案:关于PCB 的EMC设计知识考卷
  9. ASP.NET Core中的内存缓存
  10. SIFT讲解(SIFT的特征点选取以及描述是重点)
  11. Get IAT Table
  12. Rainbond 5.1.3 发布,快速部署和运维 Spring Cloud 集群
  13. 7c盘满了怎么扩容_C盘爆满怎么办?扩容!
  14. 史上最全最简洁的网络传输协议介绍
  15. 图像增强——Roberts算子、Sobel算子、Prewitt算子、Laplace算子
  16. 统一社会信用代码规则
  17. Qt-利用fmod库显示声音波形
  18. Excel 分组统计不重复项
  19. 引用pdf插件在线预览的问题
  20. Python-求一元二次方程ax^2+bx+c=0的解

热门文章

  1. 准备开发一个智能硬件,得先看这篇文章!
  2. 通俗理解白盒测试、黑盒测试
  3. Abbkine IPKine GFP标签蛋白免疫沉淀试剂盒(磁珠法)
  4. 【Mysql数据库】数据库添加索引方式
  5. B端产品经理产品心得(二)
  6. e420 thinkpad 开机黑屏_thinkpad E420开机黑屏主板门维修
  7. scaffold-dbcontext 命令使用说明
  8. c++中的pow()函数
  9. AMD CPU VMware 16 Pro安装macOS 10.15
  10. 数据库数据的备份和还原