標籤:kernel mode user mod 作業系統 kernel
1、基礎
運行 Windows 的電腦中的處理器有兩個不同模式:“使用者模式”和“核心模式”。根據處理器上啟動並執行代碼的類型,處理器在兩個模式之間切換。應用程式在使用者模式下運行,核心作業系統組件在核心模式下運行。多個驅動程式在核心模式下運行,但某些驅動程式在使用者模式下運行。
當啟動使用者模式的應用程式時,Windows 會為該應用程式建立“進程”。進程為應用程式提供專用的“虛擬位址空間”和專用的“控制代碼表格”。由於應用程式的虛擬位址空間為專用空間,一個應用程式無法更改屬於其他應用程式的資料。每個應用程式都孤立運行,如果一個應用程式損壞,則損壞會限制到該應用程式。其他應用程式和作業系統不會受該損壞的影響。
使用者模式應用程式的虛擬位址空間除了為專用空間以外,還會受到限制。在使用者模式下啟動並執行處理器無法訪問為該作業系統保留的虛擬位址。限制使用者模式應用程式的虛擬位址空間可防止應用程式更改並且可能損壞關鍵的作業系統資料。
在核心模式下啟動並執行所有代碼都共用單個虛擬位址空間。這表示核心模式驅動程式未從其他驅動程式和作業系統自身獨立開來。如果核心模式驅動程式意外寫入錯誤的虛擬位址,則屬於作業系統或其他驅動程式的資料可能會受到損壞。如果核心模式驅動程式損壞,則整個作業系統會損壞。
此圖說明了使用者模式組件與核心模式組件之間的通訊。
2、核心層次架構
下面是核心的層次劃分:
硬體抽象層(HardwareAbstraction Layer) (HAL) (hal.dll)
最底層隔離硬體的,底層的第三方驅動程式就運行在這層。
核心(Kernel)
實現作業系統的一些底層服務,比如線程調度,多處理器的同步,中斷/異常處理等。
執行體(Executive)(ntoskrnl.exe)
實現基本的作業系統服務,比如基本的線程進程管理,記憶體管理, IO及進程間通訊等。
視窗圖形子系統(Windows Graphics Subsystem)
由win32K.sys在核心層實現,使用者介面相關都依賴該層,User32.dll的大部分功能都由該層實現。
使用者層關鍵進程
Windows系統在使用者層有幾個關鍵的系統進程:
Smss.exe(session manager Subsystem)
關於Session的概念可以參考我的這篇Sessions, Window Stationsand Desktops,在作業系統啟動時會建立一個不與任何Session關聯的Smss.exe管理者執行個體,然後當有使用者登入時它會為每個Sessin拷貝一份與之關聯的Smss.exe執行個體,然後由該關聯的Smss.exe執行個體啟動winlogon.exe和csrss.exe.
WinLogon.exe
該進程系統管理使用者的登入和登出,我們按Ctrl+Alt+Del出現的介面和登入後出現的桌面視窗都是由它啟動的。
Csrss.exe( Client/Server Runtime Subsystem)
我們可以看到我們的桌面視窗(GetDesktopWindow)是由該進程建立的,該進程主要負責Win32子系統的使用者模式部分(核心模式部分由win32k.sys實現)。
Lsass.exe(Local Security Authority Subsystem)
WinLogon.exe通過該進程驗證使用者登入,登入後產生安全存取權杖對象,通過該令牌建立Explorer.exe,我們其他使用者進程都由Explorer.exe啟動,並且繼承了該令牌許可權。
Services.exe
該進程簡稱為SCM(NT Service Control Manager),該進程負責啟動使用者態一些特殊進程,也就是我們通常所說的服務程式。
3、使用者模式調用核心模式的方式
4、核心模式調用使用者模式
可以通過IOCTL的上下文傳遞,也可以通過APC (Asynchronous Procedure Call)直接調用。
5、進程間的通訊
另外一種非常強大的使用者模式與核心模式通訊方式,同時也支援進程間通訊,該方式就是ALPC(Advanced Local Procedure Call),該方式被作業系統大量使用, WinRT中的Broker進程也用到了它。
該方式實際上就4個核心函數:nt!NtAlpcSendWaitReceivePort,nt!NtAlpcCreatePort, nt!NtAlpcConnectPort, Nt!AplcAcceptConnectPort, 大概原理如下: