我們可以將驅(qū)動(dòng)程序的定義細(xì)化為觀察或參與操作系統(tǒng)與設(shè)備之間的通信的任何軟件組件。
我們的擴(kuò)展定義相當(dāng)準(zhǔn)確,但仍不完整,因?yàn)槟承?qū)動(dòng)程序根本不與任何硬件設(shè)備相關(guān)聯(lián)。
例如,如果需要編寫訪問核心操作系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的工具,可以將該工具拆分為兩個(gè)組件。 第一個(gè)組件在用戶模式下運(yùn)行且提供用戶界面。 第二個(gè)組件在內(nèi)核模式下運(yùn)行,并訪問核心操作系統(tǒng)數(shù)據(jù)。 在用戶模式下運(yùn)行的組件稱為應(yīng)用程序,在內(nèi)核模式下運(yùn)行的組件稱為“軟件驅(qū)動(dòng)程序” 。 軟件驅(qū)動(dòng)程序不與硬件設(shè)備關(guān)聯(lián)。
此圖說明了與內(nèi)核模式軟件驅(qū)動(dòng)程序通信的用戶模式應(yīng)用程序。
軟件驅(qū)動(dòng)程序始終在內(nèi)核模式下運(yùn)行。 它們主要用于訪問僅在內(nèi)核模式下可用的受保護(hù)數(shù)據(jù)。 但是,并非所有設(shè)備驅(qū)動(dòng)程序都需要訪問內(nèi)核模式數(shù)據(jù)和資源,因此某些設(shè)備驅(qū)動(dòng)程序在用戶模式下運(yùn)行。
另一種類型的驅(qū)動(dòng)程序是 總線驅(qū)動(dòng)程序。 若要了解總線驅(qū)動(dòng)程序,需要了解設(shè)備節(jié)點(diǎn)和設(shè)備樹。
到目前為止,我們的解釋過于簡化 函數(shù)驅(qū)動(dòng)程序的定義。 我們指出,設(shè)備的函數(shù)驅(qū)動(dòng)程序是堆棧中直接與設(shè)備通信的一個(gè)驅(qū)動(dòng)程序。 對于直接連接到外圍組件互連 (PCI) 總線的設(shè)備來說,這是正確的。 PCI 設(shè)備的函數(shù)驅(qū)動(dòng)程序會(huì)獲取映射到設(shè)備上的端口和內(nèi)存資源的地址。 函數(shù)驅(qū)動(dòng)程序通過寫入這些地址直接與設(shè)備通信。
但是,在許多情況下,設(shè)備無法直接連接到 PCI 總線。 相反,設(shè)備會(huì)連接到連接到 PCI 總線的主機(jī)總線適配器。 例如,USB toaster 連接到主機(jī)總線適配器(稱為 USB 主控制器),該適配器連接到 PCI 總線。 USB toaster 具有函數(shù)驅(qū)動(dòng)程序,USB 主控制器也具有函數(shù)驅(qū)動(dòng)程序。 toaster 的函數(shù)驅(qū)動(dòng)程序通過向 USB 主控制器的函數(shù)驅(qū)動(dòng)程序發(fā)送請求來與 toaster 間接通信。 然后,USB 主控制器的函數(shù)驅(qū)動(dòng)程序與 USB 主控制器硬件直接通信,該硬件與 toaster 通信。
## 參考資料