問題匯總:
User Mode:用戶模式
Knrnel Mode:內核模式
USER32.DLL : Windows Subsystem (win32k.sys)
NTDLL.DLL:
I/O Manager
Executive Service Routines
Security Reference Monitor
Process/Thread Manager
Plug and Play Manager
Power Manager
Object Manager
Cache Manager
Memory Manager
Thread Scheduling
interrupt/Exception Dispatching
Muitiprocessor Synchronization
Executive
Knrnel
HAL
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, 大概原理例如以下:
在多任務環境中,有許多進程都不允許應用程序去做。所以CPU以兩種模式運行,即用戶模式和內核模式。
①內核模式
當CPU運行於內核模式時,一切程序都可運行。任務可以執行特權級指令,對任何I/O設備有全部的訪問權,還能夠訪問任何虛地址和控制虛擬內存硬件。這種模式對應80×86的ring0層,操作系統的核心部分,包括設備驅動程序都運行在該模式。
②用戶模式
這個模式中,硬件防止特權指令的執行,並對內存和I/O空間的訪問操作進行檢查。這就允許WindowsNT4.0限制任務對各種I/O操作的訪問,並捕捉違反系統完整性的任何行為。在用戶模式中,運行的代碼如果不通過操作系統中的某種門機制,就不能進入內核模式。在80×86處理器上,這個模式對應於 ring3層,操作系統的用戶接口部分以及所有的用戶應用程序都運行在該級別。
參考文檔: https://www.cnblogs.com/mengfanrong/p/5178588.html