注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东月之神

在单纯的观念里面,生命就容易变得比较深刻!

 
 
 

日志

 
 
关于我

别驻足,梦想要不停追逐,别认输,熬过黑暗才有日出,要记住,成功就在下一步,路很苦,汗水是最美的书!

网易考拉推荐

理解和使用Linux的硬件抽象层HAL  

2011-11-24 11:52:47|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1 相关说明

1.1 网站资源
HAL的官方网址:[url]http://www.freedesktop.org/wiki/Software/hal[/url]
[url]http://opensolaris.org/os/project/tamarack/hal_re.html[/url] solaris系统上的同志写的
一篇分析HAL框架原理的文章。很好,就是版本稍微有点旧
[url]http://people.freedesktop.org/~david/talks/dynamic-device-handling-OLS-2006.pd[/url]
f 2006年Linux研讨会上,Hal的作者David Zeuthen所提交的Paper。
顺便提一下,研讨会的网址是:[url]http://www.linuxsymposium.org/[/url] 有不少Paper看起来真
的很不错啊,很有兴趣!今年的会议有好多Paper我都等不及想看看了。

1.2 工作环境
Hal本身对环境的要求是:

Linux kernel 2.6.17 (or later)
util-linux 2.12r (or later)
udev 089 (or later)
dbus 0.61 (or later)
glib 2.6.0 (or later)

我想,关键是内核了,低于这个版本的内核就不用玩了 8 )至于我的环境:

==>  硬件平台:基于ARM的嵌入式板子
==>  软件环境:Linux 2.6.21 ,自制文件系统
==>  Dbus 1.0.2
==>  Hal 0.5.10
2 理解HAL

2.1 什么是HAL
说实话,这部分很多人写过,不过为了文章的完备性,我还是从我理解的侧重点再写一下

首先HAL不是2001太空漫游系列里的那台超级电脑8 )HAL是Hardware Abstraction Layer
即硬件抽象层的首字母缩写,以下来源于Hal Spec的框图很好的说明了它的组成部分:

它是一个位于操作系统和驱动程序之上,运行在用户空间中的服务程序。
它的目的是对上层应用提供一个统一的简单的查询硬件设备的接口。它所谓的抽象,基本
上也就仅限于这一功能,它通常并不提供对硬件的实际操作,对硬件的操作,还是由应用
程序来完成。
细化来说,除了提供标准的硬件查询接口,它甚至并不考虑如何对硬件进行配置,这不是
它要完成的工作,但它确实提供了存储硬件配置相关信息的空间。下面我们会说到,那被
称为属性。
所以,简单的说,你可以把HAL理解为:一堆的硬件列表以及他们的相关属性的集合。
那么,这一堆硬件列表能有什么用呢?应该说,它简化了应用的查询逻辑,把这一部分的
复杂性转移到了应用程序之外,由HAL统一处理,其次,按作者的期望,当一些库函数也
开始使用HAL的时候,应用程序甚至可以把对不同硬件的实际操作的复杂性也交给库函数
来自动处理。
2.2 HAL的组成框架

按照上面的框图,首先是HAL daemon,HAL的服务进程。其次是硬件信息文件,后缀fdi,
再有是Callout和Addons,这些是HAL针对不同硬件进行额外的处理工作所需的一些可执行
文件或脚本。
在Hal内部,每个硬件(具体的或抽象的)都是由一个Device Object设备对象来表示。

每个设备对象会包括以下几个概念的组成部分:
UDI: Unique Device Identifer 每个设备对象的唯一标识符,它是根据BUS信息得到的,
它的目标是保证设备的唯一性,同时在一个可移除设备多次插入拔出过程中保持相同的值

Property :属性,是一个key/value pair。每个属性由一个键和一个键值组成,用来存
储设备对象相关的各种信息。
Method :方法是用来读取设置属性,或提供某些特定操作。
Interface :这个更多的是DBUS的概念。属性和方法被分类到不同的Interface中。
2.3 HAL硬件信息的来源
HAL中设备对象的相关信息来源主要有以下几种:

? 通过Sysfs得到,有相当一部分的属性是通过这种方式得到的,比如UDI,设备
的厂商,设备的父节点,设备的总线类型,硬盘的UUID啊等等。

? 通过Probe探测得到,有些设备,例如一个Camera设备,它支持哪些数据格式啊
之类的信息,对应用层?绦蛞彩怯幸庖宓模侵皇峭ü齋ysfs接口并不能得到,而通过
Linux
V4L2子系统所定义的的一些标准接口函数,通过IOCTL可以得到这些信息。通常这是由HAL
服务进程调用相应的callout去probe得到。类似还有很多子系统都定义了自己标准的接口
函数,这为HAL获取进一步的设备信息提供了可能性。次外,设备的当前状态啊,等信息
,也可能由Addon通过某
些接口得到。

?
通过fdi设备信息文件得到。还有些信息,可能是一些通用的设备信息(比如?要举个例
子),或者是通过对硬件本身的探测也无法获得的信息,比如某些键盘上的某些特殊功能
键的定义等等,还有可能是一些权限控制信息等,这些信息可以通过fdi文件添加到HAL的
设备对象信息数据中。

2.4 HAL的相关文件

首先是硬件信息文件fdi的路径会有:
/usr/share/hal/fdi 通常是由系统程序安装包提供的文件。
/etc/hal/fdi 这里是用户或者管理员修改fdi的位置。
这两个路径下各自存在information policy preprobe等3个目录,用来存放不同用途的
fdi文件。后面再解释。

其次是HAL的一些Callout和Addon,他们位于 /usr/lib/hal/scripts 及 /usr/lib/hal/
下面

再有一些与HAL本身相关的配置文件等:
/etc/init.d/hal hal的启动脚本
/etc/udev/rules.d/95-hal.rules HAL在UDEV中的规则
/etc/dbus-1/system.d/hal.conf HAL的一些常用的Interface在DBUS中的权限设置。

相关程序
/usr/bin/lshal
/usr/bin/hal-device
/usr/bin/hal-get-property
/usr/bin/hal-set-property
/usr/bin/hal-find-by-capability
/usr/bin/hal-find-by-property
/usr/bin/hal-disable-polling
/usr/bin/hal-is-caller-locked-out
/usr/bin/hal-lock
/usr/sbin
/usr/sbin/hald

2.5 HAL的设备检测流程
Hal通过udev发现一个新的设备。
首先,处理 fdi/preprobe 目录下所有匹配的文件。这个目录下的文件,典型的用途是通
过设置info.ignore属性,禁止以后的其它操作,这么做的目的通常是为了绕过某些硬件
bug或者忽略某些设备。但也不局限于此,凡是你希望在HAL对设备进行探测操作之前要处
理的事情,都可以放在这里。
而后,HAL调用preprobe中可能指定的callout做一些额外的预处理工作。
HAL开始做实际的硬件探测工作
HAL处理fdi/information目录下的所有相关文件。这里的文件的典型应用是添加一些设备
相关的信息。比如,根据bus和 vendorID 等信息匹配USB接口的某个品牌的MP3,添加其
所支持的音频格式信息(相当于以配置文件的形式,人为的告知系统这个MP3支持什么格
式)
HAL处理fdi/policy目录下的所有相关文件。这里的文件的典型应用是关联设备对象可能
对应需要的Addon和Callout,例如键盘设备可能会需要绑定一个名为hald-addon-keyboar
d的addon
HAL调用Callout ,通常来说Callout都是一些做Probe用途的程序,运行过就退出。
HAL调用Addon,Addon通常是用来监听设备状态的服务进程,生命周期和设备的生命周期
一致。
HAL将设备对象暴露出来完成整个设备检测流程。

2.6 HAL如何监听设备变更情况
做为硬件抽象层,HAL也必须负责对设备的动态变化进行监测,实时更新设备对象的信息
。这需要多方面的信息来源。
首先是UDEV:
在/etc/udev/rules.d/95-hal.rules 中,为HAL添加了下面一条规则,目的是让Udev把设
备变更信息通过socket发送给HAL。
RUN+="socket:/org/freedesktop/hal/udev_event"
在HALD的启动过程中,hald会打开并监听这个socket。

其次是通过某些addon去监听硬件行为
由于不同的硬件,有着很不同的行为,HAL还会通过一些特定的Addon来监听设备的状态变
更情况。例如针对input类设备,hald会启动一个 hald-addon-input 的Addon,它的其中
一个功能就是监听键盘事件,如果其中有sw类的事件(如sw_lid
因该是表示笔记本盖的开合,好像电源管理会模拟这个事件)则会去修改设备对象对应的
状态属性。其它Addon没有仔细研究。
BBTBOY 发表于 2008-8-15 13:18
3 使用HAL

3.1 HAL相关的一些工具
要使用hal,从hal中获得硬件相关的信息,当然可以编程啦,其次,可以使用dbus-send
工具来操作HAL的interface:
例如查询当前平台都有哪些设备:
dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/H
al/Manager org.freedesktop.Hal.Manager.GetAllDevices

当然,通过Dbus接口可以完成很强大的功能,但是多数情况下,我们可能只需要完成一些
简单的操作,那么我们可以使用例如:
3.1.1 Lshal
直接使用Lshal可以列出当前平台上的设备对象及这些设备对象的所有属性。
Lshal –t 可以以树的形式列出所有设备对象及它们的层次关系。
Lshal –m 可以用来检测hal的服务进程所发出的设备变更的信息,例如我插入了一个USB
接口的读卡器,得到下列输出:
17:31:39.068: usb_device_4cf_8819_000100000000 added
17:31:39.202: usb_device_4cf_8819_000100000000_if0 added
17:31:39.225: usb_device_4cf_8819_000100000000_usbraw added
17:31:44.130: usb_device_4cf_8819_000100000000_if0_scsi_host added
17:31:44.136: usb_device_4cf_8819_000100000000_if0_scsi_host_scsi_device_lun0
added
17:31:44.138: usb_device_4cf_8819_000100000000_if0_scsi_host_scsi_device_lun0_
scsi_generic added
17:31:44.228: storage_serial_Myson_SD_MMC_MS_Reader_000100000000_0_0 added

3.1.2 Hal-device
Hal-device也可以用来显示当前设备对象,此外还可以用-a / -r参数来添加,删除设备对
象,例如:

/ # hal-device -a /org/freedesktop/Hal/devices/try // my input
tmp udi: /org/freedesktop/Hal/devices/tmpe0743
platform.id = 'hello' //my input
created: /org/freedesktop/Hal/devices/try

/ # hal-device /org/freedesktop/Hal/devices/try
udi = '/org/freedesktop/Hal/devices/try'
platform.id = 'hello' (string)
info.udi = '/org/freedesktop/Hal/devices/try' (string)

3.1.3 配置文件
当然Hal的最常见的用法,还是通过修改和创建HAL的fdi文件,借助基于HAL的一系列程序
,完成个人所需的定制的功能。
例如,将你的USB接口的MP3在自动插入时,以指定的名字Mount到指定的位置等。

4 其它
4.1 基于HAL的一些library
前面说到,HAL的作者认为HAL真正起更大作用的时候,是当一些library也开始基于hal实
现他们的一些接口的时候。
大概查找了一下,发现的确有一些这样的library,例如 alsa系统中,有一个library实
现了名为halalsasink
的plugin,这个sink接受UDI作为他的audio设备名来处理音频的播放。这样理论说来,上
层应用无需知道,到底使?玫氖悄母鲆羝瞪璞福恍枰此璧腸apability查找到设备对
象,将它的UDI传给halalsasink即可。Alsa本身的硬件配置管理功能就比较强大,这个例
子可能看不出太大的好
处,不过,至少是一个实际的示例吧。

  评论这张
 
阅读(1136)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017