一.架構(gòu)概述下圖顯示了Windows的基本結(jié)構(gòu)。Windows采用雙模式來保護(hù)操作系統(tǒng)本身,以避免被應(yīng)用程序的錯(cuò)誤所波及。操作系統(tǒng)核心運(yùn)行在內(nèi)核模式下,應(yīng)用程序的代碼運(yùn)行在用戶模式下。每當(dāng)應(yīng)用程序需要用到系統(tǒng)內(nèi)核或內(nèi)核的擴(kuò)展模塊(內(nèi)核驅(qū)動(dòng)程序)所提供的服務(wù)時(shí),應(yīng)用程序通過硬件指令從用戶模式切換到內(nèi)核模式中;當(dāng)系統(tǒng)內(nèi)核完成了所請求的服務(wù)以后,控制權(quán)又回到了用戶模式代碼。
在Windows中,用戶代碼和內(nèi)核代碼有各自的運(yùn)行環(huán)境,而且它們可以訪問的內(nèi)存空間也不相同。在32位系統(tǒng)中,內(nèi)核代碼可以訪問當(dāng)前進(jìn)程的整個(gè)4GB虛擬地址空間,而用戶代碼只能訪問低端的2GB虛擬地址(或3GB,如果打開了內(nèi)核啟動(dòng)開關(guān)/3GB的話)。 不同的模塊工作在不同的模式下提供不同的服務(wù),一些重要的組件及工作模式如下表:
二.內(nèi)核模式簡單來說,內(nèi)核空間就是供操作系統(tǒng)內(nèi)核使用的內(nèi)存空間。內(nèi)核的核心任務(wù)是管理硬件資源,為上層提供服務(wù)。對下要面對五花八門的硬件,內(nèi)核的復(fù)雜程度可想而知。為了降低復(fù)雜度和便于開發(fā)維護(hù),內(nèi)核代碼也是模塊化的,按照職能分成若干個(gè)部分,相互協(xié)作。從這個(gè)角度來說,內(nèi)核空間中,出了狹義的內(nèi)核模塊(操作系統(tǒng)核心之核心),還有一些其他模塊。具體如下圖所示:
1.硬件抽象層(HAL)HAL的功能在Hal.dll中實(shí)現(xiàn),該模塊的主要作用就是隔離硬件的差異性,使內(nèi)核和頂層模塊可以通過統(tǒng)一的方式來訪問硬件。值得說明的是,HAL負(fù)責(zé)的硬件類型只限于CPU架構(gòu)層面的核心硬件,比如中斷控制器,固件接口等,HAL并不負(fù)責(zé)外設(shè)類型的硬件,外設(shè)硬件的差異性問題是通過I/O管理器加載不同的設(shè)備驅(qū)動(dòng)程序來解決的。 為了適應(yīng)不同的硬件平臺(tái),硬件抽象層模塊有多個(gè)不同的版本。
當(dāng)安裝Windows系統(tǒng)時(shí),安裝程序會(huì)根據(jù)檢測到的情況選擇一個(gè)合適的hal文件,復(fù)制到系統(tǒng)目錄中。 2.執(zhí)行體和內(nèi)核從文件角度看,內(nèi)核和執(zhí)行體都位于同一文件中,即通常所說的NT內(nèi)核文件。NT內(nèi)核文件有幾種版本,它們是使用同一套源代碼通過不同的編譯選項(xiàng)而編譯出來的。
為了根據(jù)需要加載正確的版本,安裝程序在安裝時(shí)會(huì)根據(jù)系統(tǒng)中的處理器個(gè)數(shù),選擇單處理器版本或多處理器版本中的一個(gè)并復(fù)制到用戶系統(tǒng)(system32)目錄中。如果復(fù)制的是多處理器版本,那么會(huì)將其改為與單處理器版本相同的名字。這也就是上面強(qiáng)調(diào)的“原始文件名”的原因,它是相對于安裝在用戶系統(tǒng)中的文件名而言的。 在32位系統(tǒng)中,由于可以在啟動(dòng)選項(xiàng)中自由選擇是否開起PAE,所以安裝程序會(huì)將支持PAE的版本和不支持PAE的版本都復(fù)制到用戶系統(tǒng)(system32)目錄中,但是會(huì)根據(jù)上面的原則選擇多處理器版本和單處理器版本中的一種,并將其改為單處理器版本名字。因此,在安裝好的Windows系統(tǒng)中就會(huì)看到ntoskrnl.exe和ntkrnlpa.exe兩個(gè)NT內(nèi)核文件。在Windows系統(tǒng)啟動(dòng)過程中,系統(tǒng)加載程序(NTLDR或WinLoad)會(huì)根據(jù)啟動(dòng)選擇中是否啟用了PAE加載其中一個(gè)。 在64位內(nèi)核中,CPU大多基于AMD64或Intel64的x64架構(gòu),x64可以看作是對PAE的一種擴(kuò)展(頁表由3級擴(kuò)展到4級,支持更長的線性地址和物理地址)。這就意味著,運(yùn)行在x64硬件上的64位內(nèi)核都是'PAE'版本的,不再有非PAE版本,因此在這也的系統(tǒng)中,system32目錄中只有一個(gè)內(nèi)核文件,而且沒有必要提是否是PAE版本了。 想要查看NT內(nèi)核文件的原始文件名,只需要右擊文件,選擇'屬性',在彈出的對話框中單擊'詳細(xì)信息'選項(xiàng)卡中的'原始文件名',就可以看到內(nèi)核文件的原始文件名
另外,由PE工具可以看到,有6個(gè)模塊被內(nèi)核模塊直接導(dǎo)入使用
A.執(zhí)行體Windows執(zhí)行體是Ntoskrnl.exe的上層,包含操作系統(tǒng)的基礎(chǔ)服務(wù),例如線程調(diào)度,進(jìn)程和線程管理,安全性,I/O,網(wǎng)絡(luò)以及進(jìn)程間的通信。它的作用就是幫助內(nèi)核行駛(執(zhí)行)某一方面的職能,比如內(nèi)存管理器負(fù)責(zé)管理和分配內(nèi)存資源,進(jìn)程管理器負(fù)責(zé)管理系統(tǒng)中的所有進(jìn)程,輸入輸出(I/O)管理器負(fù)責(zé)協(xié)調(diào)系統(tǒng)的硬件資源等待。如果把操作系統(tǒng)內(nèi)核比喻程系統(tǒng)的最高權(quán)力機(jī)構(gòu),那么執(zhí)行體便是它的一個(gè)個(gè)職能部門,負(fù)責(zé)各方面的事務(wù)。為了完成這些事務(wù),執(zhí)行體提供了下列類型的函數(shù)
B.Windows內(nèi)核操作系統(tǒng)內(nèi)核包含底層操作系統(tǒng)函數(shù),負(fù)責(zé)線程調(diào)度,中斷處理,異常分發(fā),多處理器同步等關(guān)鍵任務(wù),是操作系統(tǒng)最核心的部分,我們將其稱為微觀意義的內(nèi)核。內(nèi)核提供了一系列的例程和基本對象,執(zhí)行體和其他部分會(huì)使用它們實(shí)現(xiàn)更高層次的功能。 內(nèi)核由Ntoskrnl.exe中一系列用于提供基礎(chǔ)機(jī)制的函數(shù)組成,例如被執(zhí)行體使用的線程調(diào)度和同步服務(wù),以及與底層硬件架構(gòu)獨(dú)立的支持(例如每種處理器架構(gòu)均各異的中斷和執(zhí)行調(diào)度)。內(nèi)核代碼主要用C語言編寫,不過對于需要使用特殊處理器指令和寄存器的任務(wù),由于難以用C語言代碼訪問,因此繼續(xù)使用了匯編代碼。 與前文提到的各自執(zhí)行體支持函數(shù)類似,很多內(nèi)核函數(shù)均在WDK中提供了文檔('Ke'開頭的函數(shù)),因?yàn)樵O(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)也需要它們。 3.空閑進(jìn)程和系統(tǒng)進(jìn)程在內(nèi)核模式中包含了兩個(gè)特殊的進(jìn)程,分別是空閑進(jìn)程和系統(tǒng)進(jìn)程。之所以說它們特殊,是因?yàn)檫@兩個(gè)進(jìn)程都具有如下特征。
A.空閑進(jìn)程空閑進(jìn)程也叫Idle進(jìn)程,是空閑線程的載體。由于當(dāng)CPU一旦加電工作以后,就會(huì)不斷的取指令并執(zhí)行指令,如果當(dāng)前系統(tǒng)中并沒有需要運(yùn)行的線程,就需要給CPU一些指令,組成循環(huán),讓它在那里空轉(zhuǎn)。所以,今天的操作系統(tǒng)中,都會(huì)設(shè)計(jì)Idle進(jìn)程,Idle進(jìn)程負(fù)責(zé)占用CPU的閑置時(shí)間,當(dāng)CPU空閑的時(shí)候,就讓它執(zhí)行空閑線程。 由于每個(gè)CPU都需要空閑線程,所以空閑線程的個(gè)數(shù)就是系統(tǒng)中啟用的處理器的個(gè)數(shù),比如下面這張圖可以看出該電腦的空閑線程有4個(gè),那么CPU個(gè)數(shù)就是4。另外,空閑線程占用CPU的比例越高越好,因?yàn)榇藭r(shí)說明CPU可以對程序有更快的響應(yīng)。
在NT內(nèi)核啟動(dòng)時(shí),就會(huì)創(chuàng)建空閑進(jìn)程。更準(zhǔn)確的說,是在執(zhí)行體的階段0初始化時(shí),進(jìn)程管理器的初始化函數(shù)便會(huì)創(chuàng)建空間進(jìn)程和第一個(gè)空閑線程。可以說,第一個(gè)空閑線程是從系統(tǒng)初始啟動(dòng)線程“蛻化”而來的,是系統(tǒng)中的第一個(gè)線程。 B.系統(tǒng)進(jìn)程在系統(tǒng)啟動(dòng)階段,進(jìn)程管理器在創(chuàng)建空閑進(jìn)程后,便創(chuàng)建系統(tǒng)進(jìn)程,因此,系統(tǒng)進(jìn)程是系統(tǒng)創(chuàng)建的第二個(gè)進(jìn)程,它的進(jìn)程ID為4,父進(jìn)程ID是0,即空閑進(jìn)程。系統(tǒng)進(jìn)程的映像文件名是System,這個(gè)名稱是杜撰的,磁盤上并不存在System.exe。 系統(tǒng)進(jìn)程是一類運(yùn)行在內(nèi)核模式下的特殊線程的主體,這種特殊線程也叫做內(nèi)核模式系統(tǒng)線程,其作用是為操作系統(tǒng)提供獨(dú)立的進(jìn)程空間和進(jìn)程對象。系統(tǒng)線程具備普通用戶線程所擁有的屬性和上下文,例如硬件上下文和優(yōu)先級等,但與普通用戶模式線程不同之處在于,它只能在內(nèi)核模式下運(yùn)行,進(jìn)而執(zhí)行系統(tǒng)空間加載的代碼。這些代碼可能來自Ntoskrnl.exe或其他已加載的設(shè)備驅(qū)動(dòng)程序。此外,系統(tǒng)進(jìn)程的PEB為0,在用戶空間的運(yùn)行時(shí)間也是0,這是因?yàn)樗]有用戶空間。因此,系統(tǒng)線程不具備用戶進(jìn)程地址空間,任何動(dòng)態(tài)存儲(chǔ)都必須從操作系統(tǒng)內(nèi)存堆(例如換頁或非換頁內(nèi)存)中分配。 系統(tǒng)線程是由PsCreateSystemThread或IoCreateSystemThread函數(shù)創(chuàng)建的,這兩個(gè)函數(shù)都在WDK中有相關(guān)文檔。這些線程只能在內(nèi)核模式調(diào)用。Windows及各種設(shè)備驅(qū)動(dòng)會(huì)在系統(tǒng)初始化過程中創(chuàng)建系統(tǒng)線程,借此執(zhí)行需要線程上下文的操作,例如發(fā)起和等待I/O或其他對象,查詢對象。例如,內(nèi)存管理器會(huì)使用系統(tǒng)線程實(shí)現(xiàn)諸如將臟頁面寫入頁面文件或映像文件中,將進(jìn)程換出/換入內(nèi)存等操作;內(nèi)核會(huì)創(chuàng)建一個(gè)名為平衡機(jī)管理器的系統(tǒng)線程,該線程每秒被喚醒一次,從而有可能發(fā)起各種與調(diào)度和內(nèi)存管理有關(guān)的事件;緩存管理器也會(huì)使用系統(tǒng)線程實(shí)現(xiàn)預(yù)讀取和滯后寫入的I/O;文件服務(wù)器設(shè)備驅(qū)動(dòng)(Srv2.sys)會(huì)使用系統(tǒng)線程響應(yīng)網(wǎng)絡(luò)I/O請求,并將共享磁盤分區(qū)中的文件數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò);甚至軟盤驅(qū)動(dòng)器也會(huì)使用系統(tǒng)線程查詢軟盤設(shè)備。 默認(rèn)情況下,系統(tǒng)線程屬于System進(jìn)程的,但設(shè)備驅(qū)動(dòng)程序可以在任何進(jìn)程中創(chuàng)建系統(tǒng)線程。例如,Windows子系統(tǒng)設(shè)備驅(qū)動(dòng)(Win32k.sys)可以在Windows子系統(tǒng)進(jìn)程(Csrss.exe)的規(guī)范顯式驅(qū)動(dòng)程序(Cdd.dll)中創(chuàng)建一個(gè)系統(tǒng)線程,這也就可以輕松訪問該進(jìn)程在用戶模式地址空間中的數(shù)據(jù)。 4.內(nèi)核空間的其他模塊除了上面的內(nèi)容,內(nèi)核空間中還存在以下的這些模塊,不同的模塊有著不同的分工。
三.用戶空間用戶空間是應(yīng)用程序代碼和各種用戶態(tài)運(yùn)行的內(nèi)存空間。所謂應(yīng)用程序,就是實(shí)現(xiàn)某一方法應(yīng)用的軟件程序,比如辦公軟件,瀏覽器,即時(shí)通信程序等。用戶空間的各個(gè)模塊具體如下圖
可以看到,除了用戶安裝的或者系統(tǒng)預(yù)裝的普通應(yīng)用程序,用戶空間中還運(yùn)行著操作系統(tǒng)的一些進(jìn)程,一般將它們稱為常規(guī)進(jìn)程。從職能角度看,常規(guī)進(jìn)程的角色和內(nèi)核空間的執(zhí)行體有些類似,它們分別負(fù)責(zé)某一方面的職能,幫助內(nèi)核一起維護(hù)系統(tǒng)的秩序。 1.Ntdll.dllNtdll.dll是一個(gè)特殊的系統(tǒng)支持庫,主要被子系統(tǒng)DLL和原生應(yīng)用程序使用,用戶空間的代碼通過這個(gè)DLL來進(jìn)入系統(tǒng)空間使用內(nèi)核提供的各種服務(wù)。同時(shí),Ntdll.dll也是操作系統(tǒng)內(nèi)核在用戶空間中的“代理”,系統(tǒng)會(huì)在啟動(dòng)階段便把它加載到內(nèi)存中,并把它映射到所有用戶進(jìn)程的進(jìn)程空間中,而且映射在相同的虛擬地址中。當(dāng)內(nèi)核需要與用戶空間配合是,它會(huì)使用這個(gè)DLL中的函數(shù),因?yàn)橹挥羞@個(gè)DLL才存在于每個(gè)用戶進(jìn)程的用戶空間的固定位置上。 對于內(nèi)核的每一個(gè)系統(tǒng)服務(wù),該DLL都提供一個(gè)相應(yīng)的存根函數(shù),這些存根函數(shù)名稱以'Nt'作為前綴,例如NtCreateProcess,NtOpenFile和NtSetTimer。另外,ntdll.dll還提供了許多系統(tǒng)級的映像加載函數(shù)(以'Ldr'為前綴),Windows子系統(tǒng)進(jìn)程通信函數(shù)(以'Csr'為前綴),調(diào)試函數(shù)(以'Dbg'為前綴),系統(tǒng)事件函數(shù)(以'Etw'為前綴),以及一般的運(yùn)行支持函數(shù)(以'Rtl'為前綴)和字符串支持函數(shù)等。 2.環(huán)境子系統(tǒng)為了能夠在Windows系統(tǒng)上運(yùn)行多種類型的應(yīng)用軟件,Windows設(shè)計(jì)者在定義Windows架構(gòu)時(shí)便設(shè)計(jì)了環(huán)境子系統(tǒng)的概念。不同類型的應(yīng)用程序運(yùn)行在不同的環(huán)境子系統(tǒng)。Windows2000支持如下三種環(huán)境子系統(tǒng):
盡管Windows系統(tǒng)的基本設(shè)計(jì)思想是支持多個(gè)獨(dú)立的環(huán)境子系統(tǒng),但是為了避免多個(gè)子系統(tǒng)都重復(fù)實(shí)現(xiàn)類似的功能,Windows子系統(tǒng)有著與其他子系統(tǒng)不同的低位,Windows子系統(tǒng)可以獨(dú)立存在而且是系統(tǒng)中不可或缺的部分,其他子系統(tǒng)以Windows子系統(tǒng)為基礎(chǔ),必須依賴于Windows子系統(tǒng),而且按需要運(yùn)行(當(dāng)?shù)谝淮芜\(yùn)行相應(yīng)類型的應(yīng)用程序時(shí),才啟動(dòng)所需的子系統(tǒng))。 以下是Windows子系統(tǒng)的重要文件,大多數(shù)Windows API是由Windows子系統(tǒng)的DLL輸出的。
3.常規(guī)進(jìn)程在一個(gè)典型的Windows系統(tǒng)中,一般都運(yùn)行著以下這些常規(guī)進(jìn)程。
四.參考資料
|
|
|