理解和使用Linux的硬體抽象層HAL
作者:劉旭暉 Raymond轉載請註明出處
Email:colorant@163.com
BLOG:http://blog.csdn.net/colorant/
首頁:http://rgbbones.googlepages.com/
說來慚愧,基於ARM平台的驅動做了這麼長時間了,以前一直在kernel裡面忙活,很少瞭解上層應用相關的發展,也沒有接觸過HAL和DBUS。因為最近做的項目上層是基於X86的軟體架構來做,和以前的模式也有較大的變化,藉此機會也想瞭解一下上層應用和底層驅動的配合和以前有什麼不同,所以很自然的就需要瞭解Hal。記錄一下自己的學習理解吧。
本人的能力和測試時間有限,可能下文中有些理解、分析不一定準確,歡迎聯絡指正。
1 相關說明
1.1 網站資源
HAL的官方網址:http://www.freedesktop.org/wiki/Software/hal
http://opensolaris.org/os/project/tamarack/hal_re.html solaris系統上的同志寫的一篇分析HAL架構原理的文章。很好,就是版本稍微有點舊
http://people.freedesktop.org/~david/talks/dynamic-device-handling-OLS-2006.pdf 2006年Linux研討會上,Hal的作者David Zeuthen所提交的Paper。
順便提一下,研討會的網址是:http://www.linuxsymposium.org/ 有不少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裝置,它支援哪些資料格式啊之類的資訊,對應用程式層程式也是有意義的,但是只是通過Sysfs介面並不能得到,而通過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的裝置檢測流程