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

-----------摘录-----------

下面是hal在系统中的位置:

说明:

1.实线箭头为主动调用,虚线箭头为事件上报。

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

3.udev只是一个框架,它的行为完全受它的规则所控制,这些规则存放在目录/etc/udev/rules.d/中,其中90-hal.rules是用来让udev把设备插入/拔除的事件通过socket 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. 设备属性或能力变化时,通知相关应用程序。

Linux守护进程HALD相关推荐

  1. Linux守护进程实现

    Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...

  2. Linux 命令详解(六)Linux 守护进程的启动方法

    Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

  3. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...

  4. .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇

    Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...

  5. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  6. 深入理解Linux守护进程

    深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daem ...

  7. Linux守护进程的创建(结合nginx框架)

    Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...

  8. linux+守护进程+php,【转载】Linux 守护进程的编程方法

    [转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...

  9. linux 守护进程_网络工程师之linux守护进程

    Linux守护进程就是通常所说的DEAMON进程,linux后台服务多种多样,每一个服务都运行一个对应的程序,这些后台程序对应的进程就是守护进程.系统中可以看到很多如DHCPD和HTTPD之类的进程, ...

最新文章

  1. 【Java】LeetCode 232. 用栈实现队列
  2. 一个简单WCF项目的建立 by wsz
  3. Matlab中出现“无法打开电子表格,MATLAB报告了以下错误;错误:服务器出现意外情况”
  4. Linux服务器架设笔记-Squid服务器配置
  5. 中国联通4G携号转网业务支撑的架构实践
  6. 面试相关——计算机网络基础
  7. PHP 编写接口并在header中进行简单的校验
  8. Pix4D航测成图完整教程(空三,点云编辑DSM,正射,质量报告分析...)
  9. 微信公众号支付开发(java)实例详解
  10. ZEMAX | 如何倾斜和偏心序列光学元件
  11. java页面左右飘窗_左右飘窗代码研读
  12. eslint: globals
  13. 忘记电脑开机密码怎么办?六种方法教你解决
  14. openssl的微缩图计算
  15. VSCode(Visual Studio Code)整合Git
  16. 概率分布(probability distribution)
  17. SpringBoot 和 Vue 前后端分离教程(附源码)
  18. 三招搞定你的ubuntu安全问题
  19. python2.7下载哪个_Python2.7.13下载安装全过程(Windows版)
  20. Array [] 数组

热门文章

  1. 全栈修炼:如何从Web前端迈向全栈开发
  2. linux 编译 suitesparse,Ubuntu下编译SuiteSparse-4.4.1和METIS-4.0.3
  3. android智能小车 论文,基于安卓手机蓝牙控制的智能小车设计毕业设计(论文).doc...
  4. 停车还能360全方位影像_360°全景倒车影像、自适应巡航买的时候觉得没用,现在发现错了...
  5. 【mysql的日期和时间类型】
  6. 【SysML】模型图概览
  7. train_test_split(),随机划分训练集和测试集的函数
  8. sublime text3插件使用
  9. 基于MDB_ICP协议的纸币识别器与自动售货机通讯的研究
  10. LabVIEW编程LabVIEW开发研华通用驱动XNavi 例程与相关资料