概況
理想情況下,當一種新機器問世時,他應該可以僅僅使用新機器的編譯器來重新編譯這個作業系統,就讓他首次運行。但是,現實中並不能這樣做。雖然上層的作業系統能夠完全移植(因為它們的處理大多是內部數據結構),但底層處理的是設備暫存器、中斷、DMA和其他的硬體特性,這些都是因機器而不同的。即使大部分底層代碼是用C語言編寫的,它也不能僅僅從X86上拿出來放到Alpha上,然後重新編譯、重新啟動,因為X86和Alpha之間存在許多小的硬體差別,它們和不同的指令集相關並且不能被編譯器隱藏。
開發過程
微軟認識到了這一點並嘗試做一個很小的底層,以隱藏不同機器間的差異,這一層被稱為硬體抽象層HAL。
HAL的作用是將作業系統的其餘部分表示為抽象的硬體設備,特別是去除了真正硬體所富含的瑕疵和特質。這些設備表現為作業系統的其它部分和設備可以使用的獨立於機器的服務的形式(函式調用和宏)。通過使用HAL服務和間接硬體定址,當移植到新的硬體上時,驅動程式和核心只需做很少的改動。移植HAL本身是直接的,因為所有的機器相關代碼都集中在一個地方,並且移植的目標是充分定義的,即實現所有的HAL服務。
選擇HAL中的服務是和主機板上的晶片相關的,因為這些晶片從一個機器到另一個機器的變化是具有可預見限度的。換句話說,設計它是為了隱藏不同廠商主機板之間的差別,而不是X86和Alpha之間的差別。HAL服務包括對設備暫存器的訪問、匯流排獨立的設備定址、中斷處理和復位、DMA傳輸、定時器和實時時鐘的控制、底層的自鏇鎖(Spin Lock)和多處理機同步、BIOS接口以及CMOS配置記憶體。HAL沒有提供對特殊I/O設備(如鍵盤、滑鼠、硬碟和記憶體管理單元)的抽象或服務。
舉一個例子來說明硬體抽象層的功能。考慮記憶體映射I/O和I/O連線埠的對比。一些機器具有前者,一些機器具有後者。驅動程式該怎樣編寫?是否使用記憶體映射呢?強制選擇會使驅動程式無法移植到另一種實現方式的機器上,為此,硬體抽象層專為驅動程式的編寫者提供了三個讀設備暫存器的函式和另外三個寫暫存器的函式:
uc=READ_PORT_UCHAR(port); WRITE_PORT_UCHAR(port, uc)
us=READ_PORT_USHORT(port); WRITE_PORT_USHORT(port, us)
ul=READ_PORT_ULONG(port); WRITE_PORT_LONG(port, ul)
這些函式分別讀寫無符號8位、16位、32位的證書到特定的連線埠。由HAL決定是否需要記憶體映射I/O,這樣,一個驅動程式可以不被修改而在具有不同設備暫存器實現的機器間移植。
驅動程式常由於各種原因而訪問特定的I/O設備。在這個硬體層上,一個設備的某個匯流排上會有一個或多個地址。由於現代計算機常有多種匯流排(PCI、PCI-E、SCSI、USB等),很可能兩個或更多設備具有相同的匯流排地址,因此需要通過某種方式來區分它們。HAL提供了一個服務,該服務通過將匯流排相連的設備地址映射到系統範圍內的邏輯地址來識別設備。這樣,驅動程式就不需要知道哪條匯流排上有哪個設備了。這些邏輯地址與作業系統為用戶程式提供的指向檔案和其他系統資源的句柄是類似的。這種機制也使匯流排結構的屬性和定址方式對於高層不可見。
中斷也存在類似的問題——它們也是匯流排相關的。同樣,在這裡,HAL為系統範圍內的中斷提供命名服務,並允許驅動程式以可移植的方法將中斷服務例程和中斷聯繫起來而不用知道哪箇中斷向量對應於哪條匯流排。此外,中斷請求級別管理也在HAL處理。
HAL提供的另一項服務是以一種設備獨立的方式設定並管理DMA傳輸。系統範圍內的DMA引擎與特定I/O卡上的DMA引擎都可以操作。對設備的訪問是通過其邏輯地址進行的。HAL還實現了軟體的分散、聚集(scatter/gather)(對非連續的物理存儲塊進行寫或讀)。
此外,HAL還以一種可移植的方式管理時鐘與定時器。時間記錄以100ns為單位(起始於1601年1月1日),這樣就比以2s為單位(起始於1980年1月1日)的MS-DOS事件記錄精確得多,HAL還為許多發生於17.18.19世紀的計算機相關事件的記錄提供了致賀詞。這種時間服務將驅動程式從始終運行的實際頻率中分離出來。
核心組件(Kernel Component)有時需要在非常低的層次上同步,特別是為了避免多處理機系統中的競爭狀態。HAL提供了一些原子方法來管理這種同步,如自鏇鎖——一個CPU僅僅等待一個由其他CPU占用的系統資源被釋放,尤其是在資源只被幾條機器指令所占用的情況下。
最後,當系統啟動以後,HAL與BIOS進行對話,並檢查CMOS配置記憶體(如果有的話),以查明該系統包含了哪些匯流排和I/O設備,以及他們是如何配置的。之後這個信息會被存入註冊表,這樣,其他系統組件就能夠查詢它,而不必了解BIOS或配置記憶體如何工作。
由於HAL高度依賴於機器,它必須與其所裝入的系統完全匹配,因此,Windows的安裝光碟上提供了許多種版本的HAL。系統安裝時,選擇一種合適的HAL並以hal.dll為名複製到硬碟上的系統目錄windows\system32或winnt\system32下。之後所有的啟動都使用該版本的HAL,刪除這個檔案將導致系統無法啟動。
後語
儘管HAL已經相當高效,但對於多媒體套用而言,它的速度可能還不夠快。為此,微軟公司另外提供了一個名為DirectX的軟體包,它用附加的過程增強了HAL,並允許用戶對硬體進行更直接的訪問。DirectX在此不給予討論。