1、基礎(chǔ)
運(yùn)行 Windows 的計(jì)算機(jī)中的處理器有兩個(gè)不同模式:“用戶模式”和“內(nèi)核模式”。根據(jù)處理器上運(yùn)行的代碼的類型,處理器在兩個(gè)模式之間切換。應(yīng)用程序在用戶模式下運(yùn)行,核心操作系統(tǒng)組件在內(nèi)核模式下運(yùn)行。多個(gè)驅(qū)動(dòng)程序在內(nèi)核模式下運(yùn)行,但某些驅(qū)動(dòng)程序在用戶模式下運(yùn)行。
當(dāng)啟動(dòng)用戶模式的應(yīng)用程序時(shí),Windows 會(huì)為該應(yīng)用程序創(chuàng)建“進(jìn)程”。進(jìn)程為應(yīng)用程序提供專用的“虛擬地址空間”和專用的“句柄表格”。由于應(yīng)用程序的虛擬地址空間為專用空間,一個(gè)應(yīng)用程序無法更改屬于其他應(yīng)用程序的數(shù)據(jù)。每個(gè)應(yīng)用程序都孤立運(yùn)行,如果一個(gè)應(yīng)用程序損壞,則損壞會(huì)限制到該應(yīng)用程序。其他應(yīng)用程序和操作系統(tǒng)不會(huì)受該損壞的影響。
用戶模式應(yīng)用程序的虛擬地址空間除了為專用空間以外,還會(huì)受到限制。在用戶模式下運(yùn)行的處理器無法訪問為該操作系統(tǒng)保留的虛擬地址。限制用戶模式應(yīng)用程序的虛擬地址空間可防止應(yīng)用程序更改并且可能損壞關(guān)鍵的操作系統(tǒng)數(shù)據(jù)。
在內(nèi)核模式下運(yùn)行的所有代碼都共享單個(gè)虛擬地址空間。這表示內(nèi)核模式驅(qū)動(dòng)程序未從其他驅(qū)動(dòng)程序和操作系統(tǒng)自身獨(dú)立開來。如果內(nèi)核模式驅(qū)動(dòng)程序意外寫入錯(cuò)誤的虛擬地址,則屬于操作系統(tǒng)或其他驅(qū)動(dòng)程序的數(shù)據(jù)可能會(huì)受到損壞。如果內(nèi)核模式驅(qū)動(dòng)程序損壞,則整個(gè)操作系統(tǒng)會(huì)損壞。
此圖說明了用戶模式組件與內(nèi)核模式組件之間的通信。
2、內(nèi)核層次架構(gòu)
下面是內(nèi)核的層次劃分:
硬件抽象層(HardwareAbstraction Layer) (HAL) (hal.dll)
最底層隔離硬件的,底層的第三方驅(qū)動(dòng)程序就運(yùn)行在這層。
內(nèi)核(Kernel)
實(shí)現(xiàn)操作系統(tǒng)的一些底層服務(wù),比如線程調(diào)度,多處理器的同步,中斷/異常處理等。
執(zhí)行體(Executive)(ntoskrnl.exe)
實(shí)現(xiàn)基本的操作系統(tǒng)服務(wù),比如基本的線程進(jìn)程管理,內(nèi)存管理, IO及進(jìn)程間通訊等。
窗口圖形子系統(tǒng)(Windows Graphics Subsystem)
由win32K.sys在內(nèi)核層實(shí)現(xiàn),用戶界面相關(guān)都依賴該層,User32.dll的大部分功能都由該層實(shí)現(xiàn)。
用戶層關(guān)鍵進(jìn)程
Windows系統(tǒng)在用戶層有幾個(gè)關(guān)鍵的系統(tǒng)進(jìn)程:
Smss.exe(session manager Subsystem)
關(guān)于Session的概念可以參考我的這篇Sessions, Window Stationsand Desktops,在操作系統(tǒng)啟動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)不與任何Session關(guān)聯(lián)的Smss.exe管理者實(shí)例,然后當(dāng)有用戶登錄時(shí)它會(huì)為每個(gè)Sessin拷貝一份與之關(guān)聯(lián)的Smss.exe實(shí)例,然后由該關(guān)聯(lián)的Smss.exe實(shí)例啟動(dòng)winlogon.exe和csrss.exe.
WinLogon.exe
該進(jìn)程管理用戶的登錄和注銷,我們按Ctrl+Alt+Del出現(xiàn)的界面和登錄后出現(xiàn)的桌面窗口都是由它啟動(dòng)的。
Csrss.exe( Client/Server Runtime Subsystem)
我們可以看到我們的桌面窗口(GetDesktopWindow)是由該進(jìn)程創(chuàng)建的,該進(jìn)程主要負(fù)責(zé)Win32子系統(tǒng)的用戶模式部分(內(nèi)核模式部分由win32k.sys實(shí)現(xiàn))。
Lsass.exe(Local Security Authority Subsystem)
WinLogon.exe通過該進(jìn)程驗(yàn)證用戶登錄,登錄后產(chǎn)生安全訪問令牌對(duì)象,通過該令牌創(chuàng)建Explorer.exe,我們其他用戶進(jìn)程都由Explorer.exe啟動(dòng),并且繼承了該令牌權(quán)限。
Services.exe
該進(jìn)程簡(jiǎn)稱為SCM(NT Service Control Manager),該進(jìn)程負(fù)責(zé)啟動(dòng)用戶態(tài)一些特殊進(jìn)程,也就是我們通常所說的服務(wù)程序。
3、用戶模式調(diào)用內(nèi)核模式的方式
4、內(nèi)核模式調(diào)用用戶模式
可以通過IOCTL的上下文傳遞,也可以通過APC (Asynchronous Procedure Call)直接調(diào)用。
5、進(jìn)程間的通信
另外一種非常強(qiáng)大的用戶模式與內(nèi)核模式通訊方式,同時(shí)也支持進(jìn)程間通訊,該方式就是ALPC(Advanced Local Procedure Call),該方式被操作系統(tǒng)大量使用, WinRT中的Broker進(jìn)程也用到了它。
該方式實(shí)際上就4個(gè)核心函數(shù):nt!NtAlpcSendWaitReceivePort,nt!NtAlpcCreatePort, nt!NtAlpcConnectPort, Nt!AplcAcceptConnectPort,
聯(lián)系客服