• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 9, comments - 4, trackbacks - 0, articles - 9

            windows內(nèi)核初窺

            Posted on 2008-05-19 20:44 xlz 閱讀(126) 評論(0)  編輯 收藏 引用

            [日期:2007-10-06]  來源:25175教育信息平臺  作者:admin  閱讀:241 次  [字體: ]

            windows內(nèi)核初窺(一)--體系結(jié)構(gòu)

            windows是一個(gè)非常優(yōu)秀的OS,從今天開始,我要和大家共同分享windows給我們帶來的快樂!本人只所以將自己的學(xué)習(xí)筆記與大家分享,一是讓自己更深入的理解windows,再就是有什么疏漏之處,望大家指正!!來吧,開始我們的windows之旅! powered by 25175.net

            一,windows2000體系結(jié)構(gòu)
            (1)系統(tǒng)模型
               在大多數(shù)多用戶的OS中,用戶程序和系統(tǒng)程序是分開的---系統(tǒng)程序是一個(gè)比較高的優(yōu)先級上運(yùn)行(核心態(tài)),而用戶程序是在一個(gè)較低的等級上運(yùn)行。系統(tǒng)程 序有對系統(tǒng)數(shù)據(jù)和硬件的操作權(quán),而用戶程序要想操作系統(tǒng)數(shù)據(jù)或者硬件就只能通過系統(tǒng)程序。系統(tǒng)程序在windows2000中是以服務(wù)的形式給出。當(dāng)一個(gè) 用戶程序要訪問系統(tǒng)數(shù)據(jù)時(shí),通過向相應(yīng)的服務(wù)發(fā)出請求而實(shí)現(xiàn),而此時(shí)CPU通過一個(gè)陷阱來陷入到核心態(tài)來運(yùn)行。當(dāng)所要求的服務(wù)完成返回時(shí), windows2000負(fù)責(zé)恢復(fù)用戶線程(windows2000中,CPU是以線程為單位來進(jìn)行調(diào)度的)的寄存器狀態(tài)等,從而使得用戶線程得以繼續(xù)運(yùn) 行。windows2000中,內(nèi)核和設(shè)備驅(qū)動(dòng)都是運(yùn)行在核心態(tài),它們使用同一段內(nèi)存空間,這意味著屬于某個(gè)組成部分的數(shù)據(jù)有可能被其它的組成部分所修 改,有潛在的風(fēng)險(xiǎn)!各個(gè)組成部分之間又是可以相互協(xié)作的,為了完成一個(gè)任務(wù),往往需要這些組成部分之間進(jìn)行合作。有關(guān)系統(tǒng)模型在以后的日子我們會(huì)慢慢說
            (2)可移植性
              windows2000被設(shè)計(jì)成能在多種硬件平臺上運(yùn)行,我們可能會(huì)感到很奇怪,它是怎么實(shí)現(xiàn)其移植性的呢?我們知道每個(gè)平臺上的指令系統(tǒng)都不同,所以,不同平臺上的代碼肯定是不一樣的,所以實(shí)現(xiàn)移植性的手段也不是很神秘的,主要是以下兩點(diǎn):
                 1,windows2000是分層次的,底層部分是平臺相關(guān)的,而上層部分是平臺無關(guān)的。也就是說對于每個(gè)硬件平臺底層部分都要有一個(gè)實(shí)現(xiàn),而底層對上層 的接口是統(tǒng)一的,所以上層就不用關(guān)心底層到底是怎么樣實(shí)現(xiàn)的,它關(guān)心的就是他們之間的接口。 在windows2000中,實(shí)現(xiàn)可移植性的兩個(gè)重要部分是內(nèi)核(kenel)和硬件抽象層(HAL),這兩個(gè)部分我們以后會(huì)詳細(xì)說
                 2,windows2000的大部分是用C寫的,也有一部分是用C++寫的,匯編語言只用在直接跟硬件打交道的地方和對性能要求教高的地方。

                 上面這個(gè)系統(tǒng)結(jié)構(gòu)圖在很多書上都有,它就是windows2000的結(jié)構(gòu)圖,下面我們就來詳細(xì)說說各個(gè)部分的功能:

                  從上圖我們可以看出,在用戶態(tài),windows2000有三個(gè)子系統(tǒng),分別為win32,posix,os/2.其中最重要的就是win32,它負(fù)責(zé)輸入 輸出管理,沒有它,系統(tǒng)將無法工作,其它兩個(gè)子系統(tǒng)需要配置才能啟動(dòng)。我們主要精力放在win32上,因?yàn)檫@是我們用的最廣的。我們要特別注意以下三個(gè)關(guān) 鍵點(diǎn):子系統(tǒng)進(jìn)程,子系統(tǒng)動(dòng)態(tài)鏈接庫,用戶進(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í)文件,以及控制臺的管理。

               (2)子系統(tǒng)動(dòng)態(tài)鏈接庫:win32子系統(tǒng)用的動(dòng)態(tài)鏈接庫,里面有子系統(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)鏈接庫,當(dāng)一個(gè)程序調(diào)用子系統(tǒng)動(dòng)態(tài)鏈接庫的一個(gè)功能時(shí),可能會(huì)發(fā)生以下三中情形之一:

               (1)所要求的功能全部是由子系統(tǒng)動(dòng)態(tài)鏈接庫提供,也就是說程序完全運(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請求,具體工作由子系統(tǒng)進(jìn)程來完成。

             特別說明,當(dāng)用戶進(jìn)程調(diào)用系統(tǒng)服務(wù)時(shí)實(shí)際上是通過設(shè)置一個(gè)陷阱陷入到核心態(tài)來運(yùn)行,將運(yùn)行權(quán)交給系統(tǒng)服務(wù)調(diào)度程序來調(diào)度,并不用通過創(chuàng)建新的進(jìn)程,線程來實(shí)現(xiàn)。

            ntdll.dll

            子系統(tǒng)下面是 ntdll.dll,它提供了一些子系統(tǒng)動(dòng)態(tài)鏈接庫所需要的功能。其實(shí),NTDLL.DLL的最主要功能就是為它的下層---執(zhí)行體提供一個(gè)文檔化接口,使得它以上的各個(gè)模塊可以調(diào)用執(zhí)行體提供的服務(wù)。

            執(zhí)行體:

                  這是令人激動(dòng)的一層,因?yàn)閺倪@層開始我們就進(jìn)入了windows的核心態(tài),雖然我們對核心態(tài)的具體含義不是太清楚,沒有關(guān)系,隨著我們研究的深入你就會(huì)慢慢發(fā)現(xiàn)這是最重要的一層,因?yàn)樗衱indows的主要功能都是在這里完成的,下面我們就一點(diǎn)一點(diǎn)剖開:

                 這一層包含以下幾種重要函數(shù)(服務(wù)):

            (1)可以從用戶態(tài)直接調(diào)用的函數(shù),這些在NTDLL中文檔化(前面已說過),這些中大多數(shù)都可以調(diào)用某個(gè)WIN32 API來啟動(dòng)所對應(yīng)的服務(wù)。

            (2)只能從核心態(tài)調(diào)用的函數(shù),其中有一些在DDK中已文檔化,編寫windows上驅(qū)動(dòng)程序的人員必須熟悉的

            (3)沒有文檔化的函數(shù),供執(zhí)行體內(nèi)部使用

            執(zhí)行體從總體上可以分為以下幾個(gè)模塊:

            (1)配置管理器:負(fù)責(zé)管理注冊表,我們以后會(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è)備無關(guān)性,并負(fù)責(zé)把I/O請求分配給相應(yīng)的設(shè)備驅(qū)動(dòng)程序以進(jìn)一步處理

            (5)即插即用管理器(PNP):確定設(shè)備應(yīng)該由哪個(gè)驅(qū)動(dòng)程序來支持并負(fù)責(zé)加載相應(yīng)驅(qū)動(dòng)。在啟動(dòng)時(shí)的枚舉過程中,它收集每個(gè)設(shè)備所需要的硬件資源, 并根據(jù)設(shè)備的需要來分配合適的硬件資源如I/O端口,IRQ,DMA通道之類,當(dāng)系統(tǒng)中的設(shè)備發(fā)生變化時(shí)它負(fù)責(zé)向系統(tǒng)和應(yīng)用程序發(fā)送通知消息。

            (6)電源管理:協(xié)調(diào)電源時(shí)間,通過合理的配置,使得CPU降低電源消耗

            (7)緩沖管理器:將最近使用過的數(shù)據(jù)留在CACHE中來提高系統(tǒng)的整體性能

            (8)虛擬內(nèi)存管理:這是最為讓人激動(dòng)的地方,對于這個(gè)部分的理解會(huì)影響我們對整個(gè)系統(tǒng)結(jié)構(gòu)的理解,我們會(huì)在以后詳細(xì)解說

            (9)WDM管理方法例程:可以讓設(shè)備驅(qū)動(dòng)程序發(fā)布性能和配置信息以及從用戶態(tài)的WMI服務(wù)接受命令

                     在WINDOWS平臺上有過編程經(jīng)歷的人一定對句柄(handle)不陌生,句柄到底是什么樣的東東呢??這往往給一些初學(xué)者帶來一些迷惑。其實(shí)要真正理 解句柄就要從windows的設(shè)計(jì)理念上來解決這個(gè)問題,那就是wndows是面向?qū)ο蟮模严到y(tǒng)的一些資源,進(jìn)程,文件等都看成對象,用對象管理器對 這些對象統(tǒng)一管理。對于用戶來說是通過句柄來操作響應(yīng)對象的,可以看成是對象的一個(gè)引用。

            內(nèi)核:
                 內(nèi)核是執(zhí)行體的下一個(gè)層次,它為執(zhí)行體提供一些最基本的功能,簡單的對象,而執(zhí)行體就通過在這些簡單對象上加上一些安全屬性,控制屬性等來完成更為復(fù)雜的功能。它重要提供以下四種函數(shù):
            (1)線程調(diào)度
            (2)陷阱處理和異步調(diào)度
            (3)中斷處理和調(diào)度
            (4)多處理器同步

               內(nèi)核提供了一個(gè)低層次的系統(tǒng)原語和機(jī)制供執(zhí)行體來調(diào)用以實(shí)現(xiàn)其功能。內(nèi)核只是提供了底層的機(jī)制,而不做任何策略性的事務(wù)。但線程的調(diào)度和異常處理是在內(nèi)核中實(shí)現(xiàn)的,內(nèi)核永遠(yuǎn)都運(yùn)行在核心態(tài)。
               一類對象叫做控制對象,包括APC,DPC對象以及I/O要用到的對象,如中斷對象。
               一類對象叫做調(diào)度對象,用于線程調(diào)度。這些對象包括線程,互斥體,事件,內(nèi)核事件對,信號量,定時(shí)器,可等待定時(shí)器。

               硬件支持:
               內(nèi)核的另一主要功能是使得執(zhí)行體和設(shè)備驅(qū)動(dòng)獨(dú)立于硬件,這個(gè)工作包含處理多個(gè)方面的差異:中斷處理,異常處理,多處理器同步方式的差異

            硬件抽象層(HAL):
               這是windows2000實(shí)現(xiàn)其可移植性最重要的組成部分,HAL是一個(gè)可加載的核心態(tài)模塊(HAL.DLL),它提供了windows2000所運(yùn)行 的硬件平臺的底層接口,HAL隱藏了各種與硬件有關(guān)的細(xì)節(jié),比如I/O接口、中斷控制器、多處理通信機(jī)制等----這些都是平臺相關(guān)的。當(dāng)需要平臺相關(guān)的 信息時(shí),windows2000的內(nèi)部模塊或者用戶程序通過HAL來實(shí)現(xiàn)。

            設(shè)備驅(qū)動(dòng)程序:
               
                設(shè)備驅(qū)動(dòng)程序是核心態(tài)可加載模塊(以.SYS為擴(kuò)展名),它們是I/O管理器和相關(guān)硬件設(shè)備的接口。它們運(yùn)行于以下三種環(huán)境之一:
                (1) 在一個(gè)初始化了I/O函數(shù)的用戶線程環(huán)境中
                (2) 在內(nèi)核模式的系統(tǒng)線程中
                (3) 中斷發(fā)生后(不在任何進(jìn)程和線程中運(yùn)行,中斷發(fā)生時(shí)哪一個(gè)進(jìn)程或者線程正在運(yùn)行)
                如前所述,windows2000的設(shè)備驅(qū)動(dòng)程序并不直接操作硬件,而是調(diào)用HAL中的函數(shù)作為與硬件的接口。驅(qū)動(dòng)程序通常用C語言寫(有時(shí)用C++)。因此,設(shè)備驅(qū)動(dòng)程序通過使用HAL可以實(shí)現(xiàn)平臺無關(guān)性。
                 有以下幾中設(shè)備驅(qū)動(dòng)程序:
                (1)硬件驅(qū)動(dòng)程序:實(shí)現(xiàn)對物理硬件的讀寫(通過使用HAL)。
                (2)文件系統(tǒng)驅(qū)動(dòng)程序:是面向文件I/O的驅(qū)動(dòng)程序,它把這些請求轉(zhuǎn)化成綁定到特定設(shè)備的I/O請求
                (3)文件過濾器驅(qū)動(dòng)程序
                (4)網(wǎng)絡(luò)重定向驅(qū)動(dòng)程序
                (5)協(xié)議驅(qū)動(dòng)程序
                (6)內(nèi)核流過濾器驅(qū)動(dòng)程序
              因?yàn)榘惭b驅(qū)動(dòng)程序是把用戶編寫的用戶態(tài)代碼添加到系統(tǒng)的唯一辦法,因此,一些程序員通過編寫設(shè)備驅(qū)動(dòng)程序可以訪問OS的內(nèi)部函數(shù)或者內(nèi)部數(shù)據(jù)結(jié)構(gòu)。


                好,到此為止我們對windows2000的整體結(jié)構(gòu)有了大概的了解,在接下來的日子里我們要對每個(gè)部分進(jìn)行更為深入的研究,并且會(huì)舉一些例子程序來輔助說明,因?yàn)槲覀儗W(xué)它的目的就是為了用,為了改變!


             


            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)度:包括中斷、延遲過程調(diào)用(DPC)、異步過程調(diào)用(APC)、異常處理、系統(tǒng)服務(wù)調(diào)度。
                (2)執(zhí)行體對象管理
                (3)同步機(jī)制:自旋鎖、內(nèi)核調(diào)度對象以及等待是如何實(shí)現(xiàn)的
                (4)系統(tǒng)線程
                (5)多種系統(tǒng)機(jī)制如windows2000全局標(biāo)志
                (6)本地過程調(diào)用
            下面我們就來逐個(gè)分析:
             
            陷阱調(diào)度:
             
            中斷和異常的實(shí)質(zhì)是使CPU不按照正常的步驟來工作,硬件和軟件都能夠察覺到它們。陷阱是當(dāng)異常或者中斷發(fā)生時(shí)能夠 保存當(dāng)前線程狀態(tài)并轉(zhuǎn)向相應(yīng)處理的一種系統(tǒng)機(jī)制。在windows2000中,處理器將控制交給陷阱處理程序--一些專門來處理中斷、異常的程序。下圖給 出了一些激活陷阱處理程序的示例:

            中  斷
            中斷處理過程
            陷阱處理程序
            請求系統(tǒng)服務(wù)
            中斷處理過程
            軟、硬件異常
            異常調(diào)度程序
            異常
            處理
            虛擬地址異常
            虛擬地址管理
             
             
             
            內(nèi)核通過以下方式來分辨中斷和異常:中斷是一個(gè)異步事件(可以在任何時(shí)間產(chǎn)生),不管處理器在執(zhí)行什么程序。中斷典 型地由I/O設(shè)備、時(shí)鐘、定時(shí)器產(chǎn)生,必要時(shí)我們可以屏蔽中斷。而異常是一個(gè)同步事件,它是由正在執(zhí)行的特定代碼產(chǎn)生的,重新執(zhí)行相同的代碼會(huì)重復(fù)產(chǎn)生特 定的異常。比如訪問非法內(nèi)存、除數(shù)為0等。系統(tǒng)把系統(tǒng)服務(wù)也作為異常來處理。
            無論是硬件或者是軟件都能產(chǎn)生中斷和異常,比如說,一個(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)。 處理器通過在當(dāng)前線程的內(nèi)核棧區(qū)建立一個(gè)陷阱框架(用來保存現(xiàn)場)來實(shí)現(xiàn)。陷阱框架通常時(shí)線程整個(gè)上下文環(huán)境的一部分。而把軟中斷當(dāng)成硬中斷的一部分來處 理,或者是調(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)生中斷, 比如說,內(nèi)核可以發(fā)起一個(gè)中斷來進(jìn)行線程調(diào)度。內(nèi)核在必要的時(shí)候可以關(guān)中斷,這樣CPU就可以屏蔽掉任何中斷-----這在有些時(shí)候是必要的,比如線程對 于臨界區(qū)的訪問,異常處理等。
             硬件中斷處理:
             在X86家族里,外部中斷在中斷控制器里進(jìn)行排隊(duì),控制器依次中斷CPU的運(yùn)行。當(dāng)CPU被中斷時(shí),它要求中斷控 制器提交中斷請求,中斷控制器將中斷請求翻譯為中斷請求號,并且把這個(gè)號碼當(dāng)成索引來查詢中斷調(diào)度表(IDT),并且將控制權(quán)交給相應(yīng)的中斷處理程序。中 斷調(diào)度表(IDT)在系統(tǒng)啟動(dòng)的時(shí)候就已經(jīng)初始化了,里面包括中斷號和相應(yīng)處理程序的對應(yīng)。
             中斷請求登等級IRQL:
             中斷是有等級的,這對于軟、硬中斷都是適用。內(nèi)核將中斷為0---31共32個(gè)等級,等級高的權(quán)限高。內(nèi)核負(fù)責(zé)將軟中斷對應(yīng)到相應(yīng)的等級上,HAL負(fù)責(zé)將硬件中斷對應(yīng)到相應(yīng)的等級上。如下圖所示:
            中斷處理是按等級來運(yùn)行的,并且是搶占式的,高等級的可以阻塞低等級的運(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來實(shí)現(xiàn)映射。

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            99久久免费国产精精品| 国产成人综合久久精品红| 午夜人妻久久久久久久久| 亚洲精品乱码久久久久久| 久久国产精品成人影院| 狠狠久久综合| 婷婷伊人久久大香线蕉AV | 国产产无码乱码精品久久鸭| 亚洲国产精品久久久久婷婷老年| 久久本道综合久久伊人| 91麻豆国产精品91久久久| 996久久国产精品线观看| 久久综合色区| 国产美女久久精品香蕉69| 久久久久无码专区亚洲av| 久久婷婷五月综合97色| 伊人情人综合成人久久网小说| 国产精品9999久久久久| 亚洲国产成人久久精品99| 97精品国产91久久久久久| 综合久久一区二区三区| 国产高潮国产高潮久久久91| 久久水蜜桃亚洲av无码精品麻豆 | 青青青青久久精品国产| 亚洲精品国产自在久久| 99国内精品久久久久久久| 久久99精品久久只有精品| 国内精品久久国产| 久久精品无码一区二区日韩AV| 国产亚洲综合久久系列| 99精品国产99久久久久久97| 亚洲国产精品成人久久蜜臀| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 久久午夜夜伦鲁鲁片免费无码影视| 久久久久久久久久免免费精品| 久久免费视频网站| 国产精品久久永久免费| 72种姿势欧美久久久久大黄蕉| 青草国产精品久久久久久| 人妻无码中文久久久久专区| 久久人妻少妇嫩草AV无码专区|