什麼是驅動程式?
驅動程式 (Driver) 是一種軟體元件,介於作業系統 (Operating System) 和硬體裝置 (Device),用途是讓作業系統和裝置彼此能夠溝通。從系統層面上看,由上而下分別是應用程式 (Application)、作業系統、驅動程式與裝置,如下圖所示。驅動程式在架構上是分層堆疊 (layered in a stack) 而成,因此驅動程式不一定只和硬體裝置溝通,可能和其他驅動程式溝通。驅動程式依照用途不同可以分為下列幾類:
- 功能驅動程式 (Function Driver)
直接與硬體裝置直接溝通的驅動程式,稱為 Function Driver。 - 篩選器驅動程式 (Filter Driver)
輔助處理 I/O 請求的驅動程式,與其他驅動程式相互溝通,稱為 Filter Driver。 - 軟體驅動程式 (Software Driver)
與硬體裝置無關,是為了處理作業系統的核心資料結構,稱為 Software Driver。 - 匯流排驅動程式 (Bus Driver)
驅動匯流排以建立裝置樹的驅動程式,稱為 Bus Driver。
驅動程式由誰開發?
驅動程式是由裝置的設計者或製造者所開發,讓作業系統知道如何操作此裝置,進行資料的讀寫。另一方面,依照硬體標準所設計和製造的裝置,這些驅動程式可能就由作業系統廠商開發提供。驅動程式模型 (Driver Model)
開發硬體裝置的驅動程式有3種模型:- VxD (Virtual Device Driver):概念是將硬體裝置虛擬化,讓多個應用程式可以共用實際的硬體,所以稱為「虛擬裝置驅動程式」。是 MS-DOS、Windows 3.x 和 Windows 95 使用的技術。
- Windows Driver Model (WDM):非 NT-based 的 Windows 98 與 Windows Me,以及 NT-based 的 Windows 2000 與 Windows XP 使用的技術。
- Windows Driver Frameworks (WDF) ,以前稱為 Windows Driver Foundation (WDF),這是 Windows Vista 以後使用的技術,WDF 包含兩種框架:
硬體裝置的作業系統觀點
在 Windows 系統中,硬體裝置表示為隨插即用裝置樹 (Plug and Play Device Tree,簡稱 Device Tree) 中的裝置節點 (Device Node),裝置節點之間具有父子 (parent/child) 關係,裝置節點由多個裝置物件 (Device Object) 所堆疊組成,稱為裝置節點的裝置堆疊 (Device Stack)。裝置物件是一個DEVICE_OBJECT結構,每個裝置物件會有它對應的驅動程式,在系統上表示為驅動程式物件 (Driver Object) ,是一種DRIVER_OBJECT結構,從另一個觀點來看,裝置堆疊可以看成是「裝置物件—驅動程式」組合所堆疊而成。
裝置物件依據建立的驅動程式不同,區分為:
- 由 Bus Driver 建立的裝置物件,稱為 Physical Device Object (PDO)。
- 由 Function Driver 建立的裝置物件,稱為 Functional Device Object (FDO)。
- 由 Filter Driver 建立的裝置物件,稱為 Filter Device Object (Filter DO)。
參考資料:
- What is a driver? (Windows Drivers)
https://msdn.microsoft.com/en-us/library/windows/hardware/ff554678(v=vs.85).aspx - Device nodes and device stacks
https://msdn.microsoft.com/en-us/library/windows/hardware/ff554721(v=vs.85).aspx - Windows Driver Frameworks
https://msdn.microsoft.com/en-us/library/windows/hardware/ff557565(v=vs.85).aspx - Writing WDM Drivers
https://msdn.microsoft.com/en-us/library/windows/hardware/ff566412(v=vs.85).aspx - Overview of Windows Components (Windows Drivers)
https://msdn.microsoft.com/en-us/library/windows/hardware/ff558769(v=vs.85).aspx