改善驅動程式錯誤的相關研究大致可分成兩類:一類是從驅動程式的撰寫方面做改 善,另一分類則是去限制驅動程式的存取權限。在本章中,我們將概述這些相關研究。
2.1 Programming Model
此類研究從驅動程式的撰寫方面著手,傳統驅動程式都是用C 語言寫的,沒有『type safety』,並且驅動程式有許多程式部分都是操作硬體的程式部分,這種較低階的程式部 分被證實是比較容易出錯的,並且需要冗長過程的除錯。於是,有一些研究嘗試開發另 一種語言,讓驅動程式開發者可以用比較『安全』的語言去開發驅動程式,降低驅動程 式出錯的機率。法國University of Rennes I 研發出一種 IDL(Interface Definition
Language),稱為 Devil(A DEVice Interface Language)語言[21],它是一種較高階的描述性 語言,允許去檢查驅動程式的安全性,並且可以讓較低階的操作硬體程式碼能夠被自動 化的產生,以減少寫驅動程式時所會犯的錯誤。另外,美國Columbia 大學所研發的 NDL 語言[7],它提供裝置資源的抽象化,並且讓驅動程式的操作可以用描述的方式去開發,
以減少撰寫程式出錯的機會。
2.2
錯誤隔離(Fault Isolation)此類研究不是從驅動程式的撰寫做改善,而是去限制驅動程式的存取權限,以達到 保護系統的目的,在這一分類中主要可以分為三個方向:
2.2.1 Protection Domain
早期Palladium[3]利用虛擬記憶體硬體技術去隔離核心擴充套件(extensions)在一個 中間特權層級(intermediate privileged level)-Protection Domain,核心擴充套件只有部分權 限能夠去存取核心資料,以防止不安全的擴充套件會去危害到核心程式。
美國Washington 大學所提出的 Nooks[28][30]把驅動程式執行在特權模式(privileged mode)。他們在核心的位址空間切出多個 Protection Domain,讓每一個不同的驅動程式 能在自己的Protection Domain 中執行。所以當任何一個驅動程式出錯時,並不會危害到 其他的Protection Domain 以及核心程式。這樣的好處是幾乎是不用修改原本的驅動程 式。另外,為了避免當驅動程式當掉時會影響到一般到應用程式的執行,nooks 利用 shadow driver[29]去暫時的取代當掉的驅動程式,以防止因為驅動程式當掉而影響到一
般應用程式的運作。Nooks 的缺點是不能達到完全的錯誤隔離(Fault Isolation)。因為驅 動程式依然是執行在ring 0,依然可以使用特權(privileged)指令,並且像記憶體漏失 (memory leakage)這種會消耗系統資源的錯誤,在核心中危害也比較嚴重。
2.2.2
虛擬機器(Virtual Machine)德國卡斯魯大學(University of Karlsruhe)[18]與劍橋大學(University of Cambridge Computer Laboratory)所發展的 Xen [12]利用虛擬機器(Virtual Machine)技術把驅動程式 跟核心程式切開,驅動程式與核心程式分別執行在不同的虛擬機器中。若核心程式或應 用程式需要使用驅動程式時,核心程式就會送請求給另一台虛擬機器,請它的驅動程式 幫忙。這主要可達到兩個目的:(1)驅動程式可以重用(reuse),不必單獨為每一個作業系 統都寫一套驅動程式;(2)驅動程式錯誤隔離(Driver Fault Isolation),當驅動程式發生錯 誤時,因為是執行在與核心程式不同的虛擬機器中,所以並不會危害到執行核心程式的 虛擬機器,可以達到容錯(Fault-Tolerant)的效果。這種方法主要優點是驅動程式不用修 改,缺點是虛擬機器的負擔(overhead)比較大,因為每一個驅動程式就需要一台虛擬機 器,效能上也會比較差。
2.2.3
使用者模式驅動程式(User Mode Device Driver)這類方法早在1980 年代研究微核心系統的學者就已提出。在這種架構中,驅動程 式跟一般使用者程式一樣,都執行在使用者空間,所以不會危害到核心程式,所以也不 會造成系統當機。比較著名的有Liedtke’s L3 系統[19],Mach 3[11],以及猶他大學利用 OSkit[10]所發展出來的 Fluke kernel[20],還有許多微核心系統都是利用使用者模式驅動 程式[1] [25]。
近幾年有人開始研究把使用者模式驅動程式應用到一般的作業系統中,例如: Linux 與Windows。印度技術學院(Indian Institute of Technology, Kanpur)[32]提出一個建構在 Linux 作業系統上的一個新的使用者模式驅動程式架構,他們提出類似於原本核心中的 API,希望開發者可以照著他們提出的架構與驅動程式 API 去開發驅動程式,他們並且 也改寫了核心模式版本的驅動程式以應用到使用者模式上。另外,澳洲電信設備與系統 相關領域協會(National ICT Australia)與新南威爾士大學(University of New South Wales) [6][17]提出了另一個 Linux 作業系統上的使用者模式驅動程式架構。與印度技術學院不 同的是,他們強調使用者模式驅動程式的效能已經可以近似於核心模式驅動程式的效 能。然而,前面兩者都有共同不足的地方,那就是使用者模式驅動程式都需要額外的人 力與時間去撰寫,增加額外重新開發驅動程式的成本。
除了Linux 作業系統外,Hunt[15]在 Windows NT 上實作使用者模式驅動程式,主 要動機是希望驅動程式的開發能夠在使用者模式,這樣可以讓驅動程式的開發比較容 易,不足的是它沒有支援需要存取硬體的驅動程式類型。
最近幾年,微軟為了改善Windows 作業系統的可靠度,推出 User-Mode Driver Framework(UMDF)[2][22],希望有一些慢速裝置可以用使用者模式驅動程式。然而,微 軟的UMDF 有一些限制,包括沒有支援中斷處理(interrupt),DMA 以及不能使用 non-pageable 的記憶體等等,所以支援裝置的類型相當有限。