|
windows內(nèi)核初窺(一)--體系結(jié)構(gòu) windows是一個(gè)非常優(yōu)秀的OS,從今天開(kāi)始,我要和大家共同分享windows給我們帶來(lái)的快樂(lè)!本人只所以將自己的學(xué)習(xí)筆記與大家分享,一是讓自己更深入的理解windows,再就是有什么疏漏之處,望大家指正!!來(lái)吧,開(kāi)始我們的windows之旅! powered by 25175.net
一,windows2000體系結(jié)構(gòu)
上面這個(gè)系統(tǒng)結(jié)構(gòu)圖在很多書(shū)上都有,它就是windows2000的結(jié)構(gòu)圖,下面我們就來(lái)詳細(xì)說(shuō)說(shuō)各個(gè)部分的功能: 從上圖我們可以看出,在用戶態(tài),windows2000有三個(gè)子系統(tǒng),分別為win32,posix,os/2.其中最重要的就是win32,它負(fù)責(zé)輸入輸出管理,沒(méi)有它,系統(tǒng)將無(wú)法工作,其它兩個(gè)子系統(tǒng)需要配置才能啟動(dòng)。我們主要精力放在win32上,因?yàn)檫@是我們用的最廣的。我們要特別注意以下三個(gè)關(guān)鍵點(diǎn):子系統(tǒng)進(jìn)程,子系統(tǒng)動(dòng)態(tài)鏈接庫(kù),用戶進(jìn)程。 (1) 子系統(tǒng)進(jìn)程:win32子系統(tǒng)在windows2000中是以一個(gè)進(jìn)程的形式出現(xiàn)的(csrss.exe)。它負(fù)責(zé)所有win32用戶進(jìn)程,線程的創(chuàng)建與撤消,建立與撤消臨時(shí)文件,以及控制臺(tái)的管理。 (2)子系統(tǒng)動(dòng)態(tài)鏈接庫(kù):win32子系統(tǒng)用的動(dòng)態(tài)鏈接庫(kù),里面有子系統(tǒng)所需要的大部分功能。 (3)用戶創(chuàng)建的運(yùn)行于wn32子系統(tǒng)之上的應(yīng)用程序。 用戶進(jìn)程并不直接地調(diào)用系統(tǒng)服務(wù),它們直接調(diào)用子系統(tǒng)動(dòng)態(tài)鏈接庫(kù),當(dāng)一個(gè)程序調(diào)用子系統(tǒng)動(dòng)態(tài)鏈接庫(kù)的一個(gè)功能時(shí),可能會(huì)發(fā)生以下三中情形之一: (1)所要求的功能全部是由子系統(tǒng)動(dòng)態(tài)鏈接庫(kù)提供,也就是說(shuō)程序完全運(yùn)行于用戶態(tài)。 (2)需要調(diào)用一個(gè)或者多個(gè)運(yùn)行于核心態(tài)的服務(wù)。 (3)需要子系統(tǒng)進(jìn)程的協(xié)助才能完成,這時(shí),用戶進(jìn)程向子系統(tǒng)進(jìn)程發(fā)送一C/S請(qǐng)求,具體工作由子系統(tǒng)進(jìn)程來(lái)完成。 特別說(shuō)明,當(dāng)用戶進(jìn)程調(diào)用系統(tǒng)服務(wù)時(shí)實(shí)際上是通過(guò)設(shè)置一個(gè)陷阱陷入到核心態(tài)來(lái)運(yùn)行,將運(yùn)行權(quán)交給系統(tǒng)服務(wù)調(diào)度程序來(lái)調(diào)度,并不用通過(guò)創(chuàng)建新的進(jìn)程,線程來(lái)實(shí)現(xiàn)。 ntdll.dll 子系統(tǒng)下面是 ntdll.dll,它提供了一些子系統(tǒng)動(dòng)態(tài)鏈接庫(kù)所需要的功能。其實(shí),NTDLL.DLL的最主要功能就是為它的下層---執(zhí)行體提供一個(gè)文檔化接口,使得它以上的各個(gè)模塊可以調(diào)用執(zhí)行體提供的服務(wù)。 執(zhí)行體: 這是令人激動(dòng)的一層,因?yàn)閺倪@層開(kāi)始我們就進(jìn)入了windows的核心態(tài),雖然我們對(duì)核心態(tài)的具體含義不是太清楚,沒(méi)有關(guān)系,隨著我們研究的深入你就會(huì)慢慢發(fā)現(xiàn)這是最重要的一層,因?yàn)樗衱indows的主要功能都是在這里完成的,下面我們就一點(diǎn)一點(diǎn)剖開(kāi): 這一層包含以下幾種重要函數(shù)(服務(wù)): (1)可以從用戶態(tài)直接調(diào)用的函數(shù),這些在NTDLL中文檔化(前面已說(shuō)過(guò)),這些中大多數(shù)都可以調(diào)用某個(gè)WIN32 API來(lái)啟動(dòng)所對(duì)應(yīng)的服務(wù)。 (2)只能從核心態(tài)調(diào)用的函數(shù),其中有一些在DDK中已文檔化,編寫(xiě)windows上驅(qū)動(dòng)程序的人員必須熟悉的 (3)沒(méi)有文檔化的函數(shù),供執(zhí)行體內(nèi)部使用 執(zhí)行體從總體上可以分為以下幾個(gè)模塊: (1)配置管理器:負(fù)責(zé)管理注冊(cè)表,我們以后會(huì)詳解 (2)進(jìn)程、線程管理器:負(fù)責(zé)創(chuàng)建和終止進(jìn)程、線程。 (3)安全引用監(jiān)視器:在本地計(jì)算機(jī)上執(zhí)行安全策略,保護(hù)計(jì)算機(jī)的資源 (4)I/O管理器:實(shí)現(xiàn)I/O的設(shè)備無(wú)關(guān)性,并負(fù)責(zé)把I/O請(qǐng)求分配給相應(yīng)的設(shè)備驅(qū)動(dòng)程序以進(jìn)一步處理 (5)即插即用管理器(PNP):確定設(shè)備應(yīng)該由哪個(gè)驅(qū)動(dòng)程序來(lái)支持并負(fù)責(zé)加載相應(yīng)驅(qū)動(dòng)。在啟動(dòng)時(shí)的枚舉過(guò)程中,它收集每個(gè)設(shè)備所需要的硬件資源,并根據(jù)設(shè)備的需要來(lái)分配合適的硬件資源如I/O端口,IRQ,DMA通道之類,當(dāng)系統(tǒng)中的設(shè)備發(fā)生變化時(shí)它負(fù)責(zé)向系統(tǒng)和應(yīng)用程序發(fā)送通知消息。 (6)電源管理:協(xié)調(diào)電源時(shí)間,通過(guò)合理的配置,使得CPU降低電源消耗 (7)緩沖管理器:將最近使用過(guò)的數(shù)據(jù)留在CACHE中來(lái)提高系統(tǒng)的整體性能 (8)虛擬內(nèi)存管理:這是最為讓人激動(dòng)的地方,對(duì)于這個(gè)部分的理解會(huì)影響我們對(duì)整個(gè)系統(tǒng)結(jié)構(gòu)的理解,我們會(huì)在以后詳細(xì)解說(shuō) (9)WDM管理方法例程:可以讓設(shè)備驅(qū)動(dòng)程序發(fā)布性能和配置信息以及從用戶態(tài)的WMI服務(wù)接受命令 在WINDOWS平臺(tái)上有過(guò)編程經(jīng)歷的人一定對(duì)句柄(handle)不陌生,句柄到底是什么樣的東東呢??這往往給一些初學(xué)者帶來(lái)一些迷惑。其實(shí)要真正理解句柄就要從windows的設(shè)計(jì)理念上來(lái)解決這個(gè)問(wèn)題,那就是wndows是面向?qū)ο蟮?,它把系統(tǒng)的一些資源,進(jìn)程,文件等都看成對(duì)象,用對(duì)象管理器對(duì)這些對(duì)象統(tǒng)一管理。對(duì)于用戶來(lái)說(shuō)是通過(guò)句柄來(lái)操作響應(yīng)對(duì)象的,可以看成是對(duì)象的一個(gè)引用。
內(nèi)核: 內(nèi)核提供了一個(gè)低層次的系統(tǒng)原語(yǔ)和機(jī)制供執(zhí)行體來(lái)調(diào)用以實(shí)現(xiàn)其功能。內(nèi)核只是提供了底層的機(jī)制,而不做任何策略性的事務(wù)。但線程的調(diào)度和異常處理是在內(nèi)核中實(shí)現(xiàn)的,內(nèi)核永遠(yuǎn)都運(yùn)行在核心態(tài)。 硬件支持: 硬件抽象層(HAL): 設(shè)備驅(qū)動(dòng)程序:
windows內(nèi)核初窺(二)-系統(tǒng)機(jī)制 系統(tǒng)機(jī)制:
windows2000為執(zhí)行體、內(nèi)核、設(shè)備驅(qū)動(dòng)程序等核心態(tài)部分提供了一些基礎(chǔ)機(jī)制。先讓我們看看都有哪些: powered by 25175.net
(1)陷阱調(diào)度:包括中斷、延遲過(guò)程調(diào)用(DPC)、異步過(guò)程調(diào)用(APC)、異常處理、系統(tǒng)服務(wù)調(diào)度。
(2)執(zhí)行體對(duì)象管理
(3)同步機(jī)制:自旋鎖、內(nèi)核調(diào)度對(duì)象以及等待是如何實(shí)現(xiàn)的
(4)系統(tǒng)線程
(5)多種系統(tǒng)機(jī)制如windows2000全局標(biāo)志
(6)本地過(guò)程調(diào)用
下面我們就來(lái)逐個(gè)分析:
陷阱調(diào)度:
中斷和異常的實(shí)質(zhì)是使CPU不按照正常的步驟來(lái)工作,硬件和軟件都能夠察覺(jué)到它們。陷阱是當(dāng)異常或者中斷發(fā)生時(shí)能夠保存當(dāng)前線程狀態(tài)并轉(zhuǎn)向相應(yīng)處理的一種系統(tǒng)機(jī)制。在windows2000中,處理器將控制交給陷阱處理程序--一些專門來(lái)處理中斷、異常的程序。下圖給出了一些激活陷阱處理程序的示例:
內(nèi)核通過(guò)以下方式來(lái)分辨中斷和異常:中斷是一個(gè)異步事件(可以在任何時(shí)間產(chǎn)生),不管處理器在執(zhí)行什么程序。中斷典型地由I/O設(shè)備、時(shí)鐘、定時(shí)器產(chǎn)生,必要時(shí)我們可以屏蔽中斷。而異常是一個(gè)同步事件,它是由正在執(zhí)行的特定代碼產(chǎn)生的,重新執(zhí)行相同的代碼會(huì)重復(fù)產(chǎn)生特定的異常。比如訪問(wèn)非法內(nèi)存、除數(shù)為0等。系統(tǒng)把系統(tǒng)服務(wù)也作為異常來(lái)處理。
無(wú)論是硬件或者是軟件都能產(chǎn)生中斷和異常,比如說(shuō),一個(gè)總線異常是由硬件引起的,而除數(shù)為0顯然是軟件中的BUG導(dǎo)致的;同樣,I/O設(shè)備可以產(chǎn)生中斷,內(nèi)核本身也能產(chǎn)生軟中斷(APC,DPC)。
當(dāng)一個(gè)硬件中斷或者異常發(fā)生時(shí),處理器收集足夠的狀態(tài)信息以保證當(dāng)異?;蛑袛嗵幚硗戤吅罂梢哉_返回到當(dāng)前執(zhí)行點(diǎn)。處理器通過(guò)在當(dāng)前線程的內(nèi)核棧區(qū)建立一個(gè)陷阱框架(用來(lái)保存現(xiàn)場(chǎng))來(lái)實(shí)現(xiàn)。陷阱框架通常時(shí)線程整個(gè)上下文環(huán)境的一部分。而把軟中斷當(dāng)成硬中斷的一部分來(lái)處理,或者是調(diào)用內(nèi)核中相應(yīng)的處理程序。
在大多數(shù)情況下,當(dāng)有陷阱發(fā)生時(shí)內(nèi)核負(fù)責(zé)尋找相應(yīng)的處理程序并且在處理程序返回時(shí)負(fù)責(zé)恢復(fù)中斷線程的繼續(xù)執(zhí)行。
中斷調(diào)度:
硬件中斷是由I/O設(shè)備產(chǎn)生以求獲得CPU服務(wù)的,這種中斷機(jī)制使得CPU的利用率提高很多。軟件也能夠產(chǎn)生中斷,比如說(shuō),內(nèi)核可以發(fā)起一個(gè)中斷來(lái)進(jìn)行線程調(diào)度。內(nèi)核在必要的時(shí)候可以關(guān)中斷,這樣CPU就可以屏蔽掉任何中斷-----這在有些時(shí)候是必要的,比如線程對(duì)于臨界區(qū)的訪問(wèn),異常處理等。
硬件中斷處理:
在X86家族里,外部中斷在中斷控制器里進(jìn)行排隊(duì),控制器依次中斷CPU的運(yùn)行。當(dāng)CPU被中斷時(shí),它要求中斷控制器提交中斷請(qǐng)求,中斷控制器將中斷請(qǐng)求翻譯為中斷請(qǐng)求號(hào),并且把這個(gè)號(hào)碼當(dāng)成索引來(lái)查詢中斷調(diào)度表(IDT),并且將控制權(quán)交給相應(yīng)的中斷處理程序。中斷調(diào)度表(IDT)在系統(tǒng)啟動(dòng)的時(shí)候就已經(jīng)初始化了,里面包括中斷號(hào)和相應(yīng)處理程序的對(duì)應(yīng)。
中斷請(qǐng)求登等級(jí)IRQL:
中斷是有等級(jí)的,這對(duì)于軟、硬中斷都是適用。內(nèi)核將中斷為0---31共32個(gè)等級(jí),等級(jí)高的權(quán)限高。內(nèi)核負(fù)責(zé)將軟中斷對(duì)應(yīng)到相應(yīng)的等級(jí)上,HAL負(fù)責(zé)將硬件中斷對(duì)應(yīng)到相應(yīng)的等級(jí)上。如下圖所示:
中斷處理是按等級(jí)來(lái)運(yùn)行的,并且是搶占式的,高等級(jí)的可以阻塞低等級(jí)的運(yùn)行。當(dāng)運(yùn)行中斷處理程序時(shí),CPU把自己的IRQL設(shè)置為要執(zhí)行的中斷的IRQL,然后運(yùn)行.
那么系統(tǒng)是如何把硬件中斷映射到相應(yīng)的IRQL的呢?答案是HAL,在WINDOWS2000中,總線驅(qū)動(dòng)能夠得知所有連接到總線上的設(shè)備,以及每個(gè)設(shè)備能發(fā)出何種中斷,緊接著總線驅(qū)動(dòng)把所得到的情況匯報(bào)給PNP(即插即用管理器),它做出抉擇。最后調(diào)用HAL函數(shù)HalpGetSystemInterruptVector來(lái)實(shí)現(xiàn)映射。 |
|
|
來(lái)自: 夢(mèng)中家園 > 《編程》