用户模式与内核模式(2)
用戶模式與內(nèi)核模式
從Intel80386開始,出于安全性和穩(wěn)定性的考慮,該系列的CPU可以運行于ring0~ring3從高到低四個不同的權限級,對數(shù)據(jù)也提供相應的四個保護級別。運行于較低級別的代碼不能隨意調(diào)用高級別的代碼和訪問較高級別的數(shù)據(jù),而且也只有運行在ring0層的代碼可以直接對物理硬件進行訪問。由于WindowsNT是一個支持多平臺的操作系統(tǒng),為了與其他平臺兼容,它只利用了CPU的兩個運行級別。一個被稱為內(nèi)核模式,對應80x86的ring0層,是操作系統(tǒng)的核心部分,設備驅(qū)動程序就是運行在該模式下;另一個被稱為用戶模式,對應80x86的ring3層,操作系統(tǒng)的用戶接口部分(就是我們通常所說的win32 API)以及所有的用戶應用程序都運行在該級別。操作系統(tǒng)對運行在內(nèi)核模式下的代碼是不設防的,所以不管是建設還是破壞內(nèi)核模式下的編程都是值得去研究的。
如下圖所示為Windows操作系統(tǒng)驅(qū)動程序模型:
??????? Windows驅(qū)動程序既可以運行在用戶態(tài)也可以運行在核心模態(tài)。
?
??????? 用戶態(tài)與核心太驅(qū)動程序的區(qū)別
??????????? ? 用戶態(tài)的驅(qū)動程序運行在非特權處理機模式(nonprivileged processor mode)上,其他一些被保護的子系統(tǒng)代碼也運行在該模式上。用戶態(tài)的驅(qū)動程序不能獲得系統(tǒng)數(shù)據(jù)的存取權,除非調(diào)用Win32 API或者系統(tǒng)服務。
??????????? ? 核心態(tài)驅(qū)動程序作為操作系統(tǒng)的一個組成部分被執(zhí)行——支持一個或多個受保護的子系統(tǒng)的操作系統(tǒng)底層組件。
??? 用戶態(tài)和核心態(tài)驅(qū)動程序有不同的結構,不同的入口點和不同的系統(tǒng)接口。一個設備是需要一個用戶態(tài)驅(qū)動程序還是需要一個核心態(tài)驅(qū)動程序依賴于該設備的類型和操作系統(tǒng)對它提供的支持。
一些設備驅(qū)動程序可以完全地或部分地運行在用戶態(tài)。用戶態(tài)驅(qū)動程序沒有堆棧空間的限制,可以訪問Win32 API,并且容易調(diào)試。
大多設備驅(qū)動程序運行在核心態(tài)。核心態(tài)驅(qū)動程序可以完成某些受保護的操作,并且可以訪問用戶態(tài)驅(qū)動程序不能訪問的系統(tǒng)結構體(system sturcture)。然而,訪問權限的提高當然也要付出相應的代價——調(diào)試的艱難,系統(tǒng)隨時面臨毀壞的危險。當代碼運行在有特權的核心態(tài)環(huán)境中時,操作系統(tǒng)對代碼所請求的數(shù)據(jù)的完整性和有效性的檢查將大大減少。
為了方便,應該用高級語言(high-level language)來編寫驅(qū)動程序,通常,C適合用來編寫核心態(tài)驅(qū)動程序,C或C++則適合用于編寫用戶態(tài)驅(qū)動程序。
用戶模式與內(nèi)核模式是如何交互的呢
??? 當用戶模式程序需要讀取設備數(shù)據(jù)時,它就調(diào)用Win32 API函數(shù),如ReadFile。Win32子系統(tǒng)模塊(如KERNEL32.DLL)通過調(diào)用平臺相關的系統(tǒng)服務接口實現(xiàn)該API,而平臺相關的系統(tǒng)服務將調(diào)用內(nèi)核模式支持例程。在ReadFile調(diào)用中,調(diào)用首先到達系統(tǒng)DLL(NTDLL.DLL)中的一個入口點,NtReadFile函數(shù)。然后這個用戶模式的NtReadFile函數(shù)接著調(diào)用系統(tǒng)服務接口,最后由系統(tǒng)服務接口調(diào)用內(nèi)核模式中的服務例程,該例程同樣名為NtReadFile。
系統(tǒng)中還有許多與NtReadFile相似的服務例程,它們同樣運行在內(nèi)核模式中,為應用程序請求提供服務,并以某種方式與設備交互。它們首先檢查傳遞給它們的參數(shù)以保護系統(tǒng)安全或防止用戶模式程序非法存取數(shù)據(jù),然后創(chuàng)建一個稱為“I/O請求包(IRP)”的數(shù)據(jù)結構,并把這個數(shù)據(jù)結構送到某個驅(qū)動程序的入口點。在剛才的ReadFile調(diào)用中,NtReadFile將創(chuàng)建一個主功能代碼為IRP_MJ_READ(DDK頭文件中的一個常量)的IRP。實際的處理細節(jié)可能會有不同,但對于NtReadFile例程,可能的結果是,用戶模式調(diào)用者得到一個返回值,表明該IRP代表的操作還沒有完成。用戶模式程序也許會繼續(xù)其它工作然后等待操作完成,或者立即進入等待狀態(tài)。不論哪種方式,設備驅(qū)動程序?qū)υ揑RP的處理都與應用程序無關。
驅(qū)動程序完成一個I/O操作后,通過調(diào)用一個特殊的內(nèi)核模式服務例程來完成該IRP。完成操作是處理IRP的最后動作,它使等待的應用程序恢復運行。
總結
以上是生活随笔為你收集整理的用户模式与内核模式(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户模式 VS 内核模式(1)
- 下一篇: java仿聊天室项目总结_Java团队课