用戶模式與內核模式

從Intel80386開始,出於安全性和穩定性的考慮,該系列的CPU可以運行於ring0~ring3從高到低四個不同的權限級,對數據也提供相應的四個保護級別。運行於較低級別的代碼不能隨意調用高級別的代碼和訪問較高級別的數據,而且也只有運行在ring0層的代碼可以直接對物理硬件進行訪問。由於WindowsNT是一個支持多平臺的操作系統,爲了與其他平臺兼容,它只利用了CPU的兩個運行級別。一個被稱爲內核模式,對應80x86的ring0層,是操作系統的核心部分,設備驅動程序就是運行在該模式下;另一個被稱爲用戶模式,對應80x86的ring3層,操作系統的用戶接口部分(就是我們通常所說的win32 API)以及所有的用戶應用程序都運行在該級別。操作系統對運行在內核模式下的代碼是不設防的,所以不管是建設還是破壞內核模式下的編程都是值得去研究的。

如下圖所示爲Windows操作系統驅動程序模型:

用戶模式與內核模式

        Windows驅動程序既可以運行在用戶態也可以運行在覈心模態。
用戶態與核心太驅動程序的區別
            ? 用戶態的驅動程序運行在非特權處理機模式(nonprivileged processor mode)上,其他一些被保護的子系統代碼也運行在該模式上。用戶態的驅動程序不能獲得系統數據的存取權,除非調用Win32 API或者系統服務。
            ? 核心態驅動程序作爲操作系統的一個組成部分被執行——支持一個或多個受保護的子系統的操作系統底層組件。
    用戶態和核心態驅動程序有不同的結構,不同的入口點和不同的系統接口。一個設備是需要一個用戶態驅動程序還是需要一個核心態驅動程序依賴於該設備的類型和操作系統對它提供的支持。

一些設備驅動程序可以完全地或部分地運行在用戶態。用戶態驅動程序沒有堆棧空間的限制,可以訪問Win32 API,並且容易調試。

大多設備驅動程序運行在覈心態。核心態驅動程序可以完成某些受保護的操作,並且可以訪問用戶態驅動程序不能訪問的系統結構體(system sturcture)。然而,訪問權限的提高當然也要付出相應的代價——調試的艱難,系統隨時面臨毀壞的危險。當代碼運行在有特權的核心態環境中時,操作系統對代碼所請求的數據的完整性和有效性的檢查將大大減少。

爲了方便,應該用高級語言(high-level language)來編寫驅動程序,通常,C適合用來編寫核心態驅動程序,C或C++則適合用於編寫用戶態驅動程序。
用戶模式與內核模式是如何交互的呢

    當用戶模式程序需要讀取設備數據時,它就調用Win32 API函數,如ReadFile。Win32子系統模塊(如KERNEL32.DLL)通過調用平臺相關的系統服務接口實現該API,而平臺相關的系統服務將調用內核模式支持例程。在ReadFile調用中,調用首先到達系統DLL(NTDLL.DLL)中的一個入口點,NtReadFile函數。然後這個用戶模式的NtReadFile函數接着調用系統服務接口,最後由系統服務接口調用內核模式中的服務例程,該例程同樣名爲NtReadFile。

系統中還有許多與NtReadFile相似的服務例程,它們同樣運行在內核模式中,爲應用程序請求提供服務,並以某種方式與設備交互。它們首先檢查傳遞給它們的參數以保護系統安全或防止用戶模式程序非法存取數據,然後創建一個稱爲“I/O請求包(IRP)”的數據結構,並把這個數據結構送到某個驅動程序的入口點。在剛纔的ReadFile調用中,NtReadFile將創建一個主功能代碼爲IRP_MJ_READ(DDK頭文件中的一個常量)的IRP。實際的處理細節可能會有不同,但對於NtReadFile例程,可能的結果是,用戶模式調用者得到一個返回值,表明該IRP代表的操作還沒有完成。用戶模式程序也許會繼續其它工作然後等待操作完成,或者立即進入等待狀態。不論哪種方式,設備驅動程序對該IRP的處理都與應用程序無關。

驅動程序完成一個I/O操作後,通過調用一個特殊的內核模式服務例程來完成該IRP。完成操作是處理IRP的最後動作,它使等待的應用程序恢復運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章