HAL是Hardware Abstraction Layer的首字母縮寫(xiě)

發(fā)布時(shí)間:2009-12-14 22:04    發(fā)布者:linux_Ultra
關(guān)鍵詞: Abstraction , HAL , Hardware , layer , 縮寫(xiě)
hal正是我們下一步要關(guān)心的,接下來(lái)我會(huì )分析HAL的實(shí)現原理。


HALHardware Abstraction Layer的首字母縮寫(xiě)。我最早是在Winnt 3.5的幫助中知道這個(gè)名詞的,對幫助文檔中的說(shuō)法我比較認同,所以一直對它抱有好感。不過(guò)Windows下的HALLinux下的HAL兩者所指并非相同之物:

Windows下的HAL位于操作系統的最底層,直接操作物理硬件,隔離與硬件相關(guān)的信息,為上層的操作系統和設備驅動(dòng)程序提供一個(gè)統一的接口,起到對硬件的抽象作用。有了HAL,編寫(xiě)驅動(dòng)程序就容易多了,因為HAL的接口不但使用簡(jiǎn)單,而且具有更好的可移植性(沒(méi)用過(guò))。

Linux 下的HAL:至于對硬件的抽象,Linux內核早就有類(lèi)似機制,只不過(guò)沒(méi)有專(zhuān)門(mén)的名稱(chēng)罷了。而LinuxHAL指的并非這個(gè),它不是位于操作系統的最底層,直接操作硬件,相反,它位于操作系統和驅動(dòng)程序之上,是一個(gè)運行在用戶(hù)空間中服務(wù)程序。

我們知道,Linux和所有的Unix一樣,習慣用文件來(lái)抽象設備,任何設備都是一個(gè)文件,比如/dev/mouse是鼠標的設備文件。這種方法看起來(lái)不錯,每個(gè)設備都有統一的形式,但使用并不那么容易,設備文件名沒(méi)有什么規范,從簡(jiǎn)單的一個(gè)文件名,你無(wú)法得知它是什么設備,具有有什么特性。

結果形成這樣的尷尬:有了設備和設備驅動(dòng)程序,卻不知道如何使用它。這些亂七八糟的設備文件,讓設備的管理和應用程序的開(kāi)發(fā)都變得很麻煩,所以有必要提供一個(gè)硬件抽象層,來(lái)為上層應用程序提供一個(gè)統一的接口,LinuxHAL就這樣應運而生了。

HAL并不提供諸如拍照和刻錄等之類(lèi)的功能,相反它只是告訴應用程序,系統中有哪些設備可用,以及這些設備的類(lèi)型、特性和能力等。主要說(shuō)來(lái),它提供以下幾項功能:
1.
獲取指定類(lèi)型的設備列表。

2.
獲取/更改設備的屬性值。

3.
獲取設備具有的能力描述。

4.
設備插入/拔除時(shí),通知相關(guān)應用程序。

5.
設備屬性或能力變化時(shí),通知相關(guān)應用程序。


udev創(chuàng )建dev下的文件結點(diǎn),加載驅動(dòng)程序,讓設備處于可用狀態(tài)。而HAL則告訴應用程序,現在有哪些設備可用,這些設備的類(lèi)型、特性和能力,讓?xiě)贸绦蛑廊绾问褂盟鼈儭?/font>

設備的屬性管理是HAL最重要任務(wù)之一,有的設備屬性來(lái)源于實(shí)際的硬件,有的來(lái)源于設備信息文件(/usr/share/hal/fdi/),有的來(lái)源其它配置信息(/usr/share/hwdata/)。設備屬性的都有標準的定義,這些屬性定義是HALSPEC的主要內容之一,可以參考http://people.freedesktop.org/~david/hal-spec/hal-spec.html。

HAL作為一個(gè)后臺服務(wù)程序運行,它的主體架構基于MVC的模型,在DBUS的幫助下,實(shí)現了異步事件通知機制。HAL的分層視圖如下:



說(shuō)明:
1.
實(shí)線(xiàn)箭頭為主動(dòng)調用,虛線(xiàn)箭頭為事件上報。


2.
udev
通過(guò)NetLink注冊?xún)群说脑O備事件,當有設備插入/拔除時(shí),udev就會(huì )收到通知,它會(huì )從事件中所帶參數和sysfs中的信息,加載適當的驅動(dòng)程序,創(chuàng )建dev下的結點(diǎn),讓設備處于可用的狀態(tài)。


3.
udev
只是一個(gè)框架,它的行為完全受它的規則所控制,這些規則存放在目錄/etc/udev/rules.d/中,其中90-hal.rules是用來(lái)讓udev把設備插入/拔除的事件通過(guò)socket socket:/org/freedesktop/hal/udev_event轉發(fā)給HAL的。


4.
HAL
掛在socket:/org/freedesktop/hal/udev_event上等待事件,有事件發(fā)生時(shí)就調用函數hald_udev_data處理,它先從事件中取出主要參數,創(chuàng )建一個(gè)hotplug_event對象,把它放入事件隊列中,然后調用hotplug_event_process_queue處理事件。


5.
函數hotplug_event_begin負責具體事件的處理,它把全部事件分為四類(lèi),并分別處理hotplug_event_begin_sysfs處理普通設備事件,hotplug_event_begin_acpi處理ACPI事件,hotplug_event_begin_apm處理APM事件,hotplug_event_begin_pmu處理PMU事件。要注意的是,后三者的事件源并非源于udev,而是在device_reprobe時(shí)觸發(fā)的(osspec_device_reprobe/hotplug_reprobe_tree/hotplug_reprobe_generate_add_events/acpi_generate_add_hotplug_event)。


6.
函數hotplug_event_begin_sysfs中,如果是插入設備,則創(chuàng )建一個(gè)設備對象,設置設備的屬性,調用相關(guān)callouts,然后放入設備列表中,并觸發(fā)signaldbus通知相關(guān)應用程序。如果是拔除設備,則調用相關(guān)callouts,然后從設備列表中刪除,并觸發(fā)signaldbus通知相關(guān)應用程序。


7.
應用程序可以主動(dòng)調用HAL提供的DBUS接口函數,這些函數在libhal.h中有定義。應用程序也可以注冊HALsignal,當設備變化時(shí),HAL通過(guò)DBUS上報事件給應用程序。


8.
callout
HAL一種擴展方式,它在設備插入/拔除時(shí)執行?梢栽谠O備信息文件中(/usr/share/hal目錄)指定。


9.
addon
也是HAL一種擴展方式,它與callout的不同之處在于addon往往是事件的觸發(fā)者,而不是事件的消費者。HAL的事件源主要源于udev,而udev源于kernelhotplug,然而有的設備如電源設備、磁盤(pán)設備和特殊按鍵等,它們并不產(chǎn)生hotplug事件。HAL就得不到通知,怎么辦呢,addon就是用于支持新事件源的擴展方式。比如addon-acpi/proc/acpi/event或者/var/run/acpid.socket收到事件,然后轉發(fā)成HAL事件。addon-storage檢測光盤(pán)或磁盤(pán)的狀態(tài),并設置設備的屬性。addon-keyboard檢測一些特殊按鍵,并觸發(fā)相應事件。


access-check/ci-tracker/ck-tracker負責權限的檢查,里面提到的PolicyKit/ConsoleKit不是太熟悉,有時(shí)間再看看。

簡(jiǎn)單的說(shuō),HAL就是一個(gè)設備數據庫,它管理當前系統中所有的設備,你可以以多種靈活的方式去查詢(xún)這些設備,可以獲取指定設備的特性,可以注冊設備變化事件。
本文地址:http://selenalain.com/thread-6532-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
geyingzhen 發(fā)表于 2009-12-15 15:39:05
頂!
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页