Ads 468x60px

##EasyReadMore##

06 10月, 2015

HAL, Hardware Abstraction Layer 硬體抽象層

硬體抽象層(HAL, Hardware Abstraction Layer),是抽象層的一種,是實作於硬體和執行於該電腦的軟體之間的一種特殊軟體。它的功用是將硬體方面的不同,隱藏並抽離於作業系統的核心之中。如此一來核心模式的程式碼就不必因為硬體的不同而需要修改。所以硬體抽象層可增進軟體的可移植性。

如果要將其簡單說明話你可以把HAL視為實際硬體裝置和windows 系統核心之間的一個介面, 也就是kernel只要針對某一個標準版的硬體寫出來後當系統要下達指令給硬體時則由硬體抽象層攔收該指令並轉成特定硬體指令再送達至硬體. 這也是為什麼xp或vista 雖然可以在不同cpu+主機板上運作, 但當你把硬碟換裝他机就藍屏的許多原因之一. 如果沒有硬體抽象層這,那麼一套作業系統就必需要寫很多版本以適應不同品牌或規格的cpu了. 因而當硬體裝置不同時,windows在設定/灌裝時實際上是先偵測後再裝不同的硬體抽象層. 開機時會先載入硬體抽象層,再載入系統控制程式/指令. 這時HAL也會指定那些指另是必需載入的, 例如多核的cpu或單核就是在這時決定,還有相關的裝置驅動程式和服務也是. 同步也決定相互間的依賴關係,例如你要開一個USB的机器時usb的裝置驅動程式必需架構在USB IC的驅動上面,那麼你下指令時實際是下windows->usb裝置驅動程式->再 USB IC的驅動-> CPU 再執行. 例如隨身碟反應時則照反順序回來.

2008-10-07 07:30:39 補充:
所以我認為"隱藏並抽離於作業系統的核心之中" 要改成"-直接-抽離-出-作業系統的核心之-外-並單獨執行-" 這樣說明就更清楚了.

舉個例子, 過去嵌入裝置要有2G/3G 電話或上網功能, 硬體尚須用UART/RS232連接一個GSM/GPRS模組, 軟體上則需經由UART傳送AT  command,   AT 命命是GSM 通用命令,
GSM模組接收到AT命令後, 便對命令進行解析, 而後依據命令內容進行撥打電話, 傳送資料等動作.   對android系統而言, 其最上層是用 java提供了打/收電話, 傳資料的API, 而所謂電信HAL層,
則是將Java 電信 API 解析為AT 命令, 經由UART 傳給GSM/GPRS模組.
如果沒有電信HAL層,  使用者需自己將 java 電信API, 轉換成AT command, 反之亦然.  如果有HAL層, 則可大幅減少使用者coding時間.  

這中間牽涉2個關鍵程式, 一個HAL, 另一個是UART驅動.  uart驅動, 大部分BSP開發板已經提供,
不需作任何更動, 只需作tty選擇與baudrate設定, 而HAL層需依GSM/GPRS模組之不同而調整.

屆此, 如果讀者還不懂, 再舉一例. GPS裝置好了. 其底層驅動一樣是用UART/RS232, 而其HAL 層
則實做GPS NMEA碼之解析.  NMEA碼為GPS裝置輸出之通用格式, 藉由解析NMEA, 則可得到gps衛星定位資訊, 如方向, 速度, 經緯度等等.  GPS HAL解析NEAM碼之後, 往上層java location 等
API 提供定位資訊.

至此, 明顯可以看出 ttySx提供Uart/RS232硬體驅動, 而不同HAL, 則解析由硬體驅動提供的命令,
並上傳到java API

Android的硬件抽像層,簡單來說,就是對Linux內核驅動程序的封裝,向上提供接口,屏蔽低層的實現細節。也就是說,把對硬件的支持分成了兩層,一層放在用戶空間(User Space),一層放在內核空間(Kernel Space),其中,硬件抽像層運行在用戶空間,而Linux內核驅動程序運行在內核空間。為什麼要這樣安排呢?把硬件抽像層和內核驅動整合在一起放在內核空間不可行嗎?從技術實現的角度來看,是可以的,然而從商業的角度來看,把對硬件的支持邏輯都放在內核空間,可能會損害廠家的利益。我們知道,Linux內核源代碼版權遵循GNU License,而Android源代碼版權遵循Apache License,前者在發佈產品時,必須公佈源代碼,而後者無鬚髮布源代碼。如果把對硬件支持的所有代碼都放在Linux驅動層,那就意味著發佈時要公開驅動程序的源代碼,而公開源代碼就意味著把硬件的相關參數和實現都公開了,在手機市場競爭激烈的今天,這對廠家來說,損害是非常大的。因此,Android才會想到把對硬件的支持分成硬件抽像層和內核驅動層,內核驅動層只提供簡單的訪問硬件邏輯,例如讀寫硬件寄存器的通道,至於從硬件中讀到了什麼值或者寫了什麼值到硬件中的邏輯,都放在硬件抽像層中去了,這樣就可以把商業秘密隱藏起來了。也正是由於這個分層的原因,Android被踢出了Linux內核主線代碼樹中。大家想想,Android放在內核空間的驅動程序對硬件的支持是不完整的,把Linux內核移植到別的機器上去時,由於缺乏硬件抽像層的支持,硬件就完全不能用了,這也是為什麼說Android是開放系統而不是開源系統的原因。

撇開這些爭論,學習Android硬件抽像層,對理解整個Android整個系統,都是極其有用的,因為它從下到上涉及到了Android系統的硬件驅動層、硬件抽像層、運行時庫和應用程序框架層等等,下面這個圖闡述了硬件抽像層在Android系統中的位置,以及它和其它層的關係:

硬體抽象層的解釋 | Yahoo奇摩知識+
https://goo.gl/kllktg

49歐姆 整機教學: android HAL 硬體抽象層
http://goo.gl/I3h7Hk

0 意見:

張貼留言

 
Blogger Templates