windows是一個非常優(yōu)秀的OS,從今天開始,我要和大家共同分享windows給我們帶來的快樂!本人只所以將自己的學習筆記與大家分享,一是讓自己更深入的理解windows,再就是有什么疏漏之處,望大家指正!!來吧,開始我們的windows之旅!
一,windows2000體系結構
(1)系統(tǒng)模型
在大多數(shù)多用戶的OS中,用戶程序和系統(tǒng)程序是分開的---系統(tǒng)程序是一個比較高的優(yōu)先級上運行(核心態(tài)),而用戶程序是在一個較低的等級上運行。系統(tǒng)程序有對系統(tǒng)數(shù)據和硬件的操作權,而用戶程序要想操作系統(tǒng)數(shù)據或者硬件就只能通過系統(tǒng)程序。系統(tǒng)程序在windows2000中是以服務的形式給出。當一個用戶程序要訪問系統(tǒng)數(shù)據時,通過向相應的服務發(fā)出請求而實現(xiàn),而此時CPU通過一個陷阱來陷入到核心態(tài)來運行。當所要求的服務完成返回時,windows2000負責恢復用戶線程(windows2000中,CPU是以線程為單位來進行調度的)的寄存器狀態(tài)等,從而使得用戶線程得以繼續(xù)運行。windows2000中,內核和設備驅動都是運行在核心態(tài),它們使用同一段內存空間,這意味著屬于某個組成部分的數(shù)據有可能被其它的組成部分所修改,有潛在的風險!各個組成部分之間又是可以相互協(xié)作的,為了完成一個任務,往往需要這些組成部分之間進行合作。有關系統(tǒng)模型在以后的日子我們會慢慢說
(2)可移植性
windows2000被設計成能在多種硬件平臺上運行,我們可能會感到很奇怪,它是怎么實現(xiàn)其移植性的呢?我們知道每個平臺上的指令系統(tǒng)都不同,所以,不同平臺上的代碼肯定是不一樣的,所以實現(xiàn)移植性的手段也不是很神秘的,主要是以下兩點:
1,windows2000是分層次的,底層部分是平臺相關的,而上層部分是平臺無關的。也就是說對于每個硬件平臺底層部分都要有一個實現(xiàn),而底層對上層的接口是統(tǒng)一的,所以上層就不用關心底層到底是怎么樣實現(xiàn)的,它關心的就是他們之間的接口。 在windows2000中,實現(xiàn)可移植性的兩個重要部分是內核(kenel)和硬件抽象層(HAL),這兩個部分我們以后會詳細說
2,windows2000的大部分是用C寫的,也有一部分是用C++寫的,匯編語言只用在直接跟硬件打交道的地方和對性能要求教高的地方。
上面這個系統(tǒng)結構圖在很多書上都有,它就是windows2000的結構圖,下面我們就來詳細說說各個部分的功能:
從上圖我們可以看出,在用戶態(tài),windows2000有三個子系統(tǒng),分別為win32,posix,os/2.其中最重要的就是win32,它負責輸入輸出管理,沒有它,系統(tǒng)將無法工作,其它兩個子系統(tǒng)需要配置才能啟動。我們主要精力放在win32上,因為這是我們用的最廣的。我們要特別注意以下三個關鍵點:子系統(tǒng)進程,子系統(tǒng)動態(tài)鏈接庫,用戶進程。
(1) 子系統(tǒng)進程:win32子系統(tǒng)在windows2000中是以一個進程的形式出現(xiàn)的(csrss.exe)。它負責所有win32用戶進程,線程的創(chuàng)建與撤消,建立與撤消臨時文件,以及控制臺的管理。
(2)子系統(tǒng)動態(tài)鏈接庫:win32子系統(tǒng)用的動態(tài)鏈接庫,里面有子系統(tǒng)所需要的大部分功能。
(3)用戶創(chuàng)建的運行于wn32子系統(tǒng)之上的應用程序。
用戶進程并不直接地調用系統(tǒng)服務,它們直接調用子系統(tǒng)動態(tài)鏈接庫,當一個程序調用子系統(tǒng)動態(tài)鏈接庫的一個功能時,可能會發(fā)生以下三中情形之一:
(1)所要求的功能全部是由子系統(tǒng)動態(tài)鏈接庫提供,也就是說程序完全運行于用戶態(tài)。
(2)需要調用一個或者多個運行于核心態(tài)的服務。
(3)需要子系統(tǒng)進程的協(xié)助才能完成,這時,用戶進程向子系統(tǒng)進程發(fā)送一C/S請求,具體工作由子系統(tǒng)進程來完成。
特別說明,當用戶進程調用系統(tǒng)服務時實際上是通過設置一個陷阱陷入到核心態(tài)來運行,將運行權交給系統(tǒng)服務調度程序來調度,并不用通過創(chuàng)建新的進程,線程來實現(xiàn)。
ntdll.dll
子系統(tǒng)下面是 ntdll.dll,它提供了一些子系統(tǒng)動態(tài)鏈接庫所需要的功能。其實,NTDLL.DLL的最主要功能就是為它的下層---執(zhí)行體提供一個文檔化接口,使得它以上的各個模塊可以調用執(zhí)行體提供的服務。
執(zhí)行體:
這是令人激動的一層,因為從這層開始我們就進入了windows的核心態(tài),雖然我們對核心態(tài)的具體含義不是太清楚,沒有關系,隨著我們研究的深入你就會慢慢發(fā)現(xiàn)這是最重要的一層,因為所有windows的主要功能都是在這里完成的,下面我們就一點一點剖開:
這一層包含以下幾種重要函數(shù)(服務):
(1)可以從用戶態(tài)直接調用的函數(shù),這些在NTDLL中文檔化(前面已說過),這些中大多數(shù)都可以調用某個WIN32 API來啟動所對應的服務。
(2)只能從核心態(tài)調用的函數(shù),其中有一些在DDK中已文檔化,編寫windows上驅動程序的人員必須熟悉的
(3)沒有文檔化的函數(shù),供執(zhí)行體內部使用
執(zhí)行體從總體上可以分為以下幾個模塊:
(1)配置管理器:負責管理注冊表,我們以后會詳解
(2)進程、線程管理器:負責創(chuàng)建和終止進程、線程。
(3)安全引用監(jiān)視器:在本地計算機上執(zhí)行安全策略,保護計算機的資源
(4)I/O管理器:實現(xiàn)I/O的設備無關性,并負責把I/O請求分配給相應的設備驅動程序以進一步處理
(5)即插即用管理器(PNP):確定設備應該由哪個驅動程序來支持并負責加載相應驅動。在啟動時的枚舉過程中,它收集每個設備所需要的硬件資源,并根據設備的需要來分配合適的硬件資源如I/O端口,IRQ,DMA通道之類,當系統(tǒng)中的設備發(fā)生變化時它負責向系統(tǒng)和應用程序發(fā)送通知消息。
(6)電源管理:協(xié)調電源時間,通過合理的配置,使得CPU降低電源消耗
(7)緩沖管理器:將最近使用過的數(shù)據留在CACHE中來提高系統(tǒng)的整體性能
(8)虛擬內存管理:這是最為讓人激動的地方,對于這個部分的理解會影響我們對整個系統(tǒng)結構的理解,我們會在以后詳細解說
(9)WDM管理方法例程:可以讓設備驅動程序發(fā)布性能和配置信息以及從用戶態(tài)的WMI服務接受命令
在WINDOWS平臺上有過編程經歷的人一定對句柄(handle)不陌生,句柄到底是什么樣的東東呢??這往往給一些初學者帶來一些迷惑。其實要真正理解句柄就要從windows的設計理念上來解決這個問題,那就是wndows是面向對象的,它把系統(tǒng)的一些資源,進程,文件等都看成對象,用對象管理器對這些對象統(tǒng)一管理。對于用戶來說是通過句柄來操作響應對象的,可以看成是對象的一個引用。
內核:
內核是執(zhí)行體的下一個層次,它為執(zhí)行體提供一些最基本的功能,簡單的對象,而執(zhí)行體就通過在這些簡單對象上加上一些安全屬性,控制屬性等來完成更為復雜的功能。它重要提供以下四種函數(shù):
(1)線程調度
(2)陷阱處理和異步調度
(3)中斷處理和調度
(4)多處理器同步
內核提供了一個低層次的系統(tǒng)原語和機制供執(zhí)行體來調用以實現(xiàn)其功能。內核只是提供了底層的機制,而不做任何策略性的事務。但線程的調度和異常處理是在內核中實現(xiàn)的,內核永遠都運行在核心態(tài)。
一類對象叫做控制對象,包括APC,DPC對象以及I/O要用到的對象,如中斷對象。
一類對象叫做調度對象,用于線程調度。這些對象包括線程,互斥體,事件,內核事件對,信號量,定時器,可等待定時器。
硬件支持:
內核的另一主要功能是使得執(zhí)行體和設備驅動獨立于硬件,這個工作包含處理多個方面的差異:中斷處理,異常處理,多處理器同步方式的差異
硬件抽象層(HAL):
這是windows2000實現(xiàn)其可移植性最重要的組成部分,HAL是一個可加載的核心態(tài)模塊(HAL.DLL),它提供了windows2000所運行的硬件平臺的底層接口,HAL隱藏了各種與硬件有關的細節(jié),比如I/O接口、中斷控制器、多處理通信機制等----這些都是平臺相關的。當需要平臺相關的信息時,windows2000的內部模塊或者用戶程序通過HAL來實現(xiàn)。
設備驅動程序:
設備驅動程序是核心態(tài)可加載模塊(以.SYS為擴展名),它們是I/O管理器和相關硬件設備的接口。它們運行于以下三種環(huán)境之一:
(1) 在一個初始化了I/O函數(shù)的用戶線程環(huán)境中
(2) 在內核模式的系統(tǒng)線程中
(3) 中斷發(fā)生后(不在任何進程和線程中運行,中斷發(fā)生時哪一個進程或者線程正在運行)
如前所述,windows2000的設備驅動程序并不直接操作硬件,而是調用HAL中的函數(shù)作為與硬件的接口。驅動程序通常用C語言寫(有時用C++)。因此,設備驅動程序通過使用HAL可以實現(xiàn)平臺無關性。
有以下幾中設備驅動程序:
(1)硬件驅動程序:實現(xiàn)對物理硬件的讀寫(通過使用HAL)。
(2)文件系統(tǒng)驅動程序:是面向文件I/O的驅動程序,它把這些請求轉化成綁定到特定設備的I/O請求
(3)文件過濾器驅動程序
(4)網絡重定向驅動程序
(5)協(xié)議驅動程序
(6)內核流過濾器驅動程序
因為安裝驅動程序是把用戶編寫的用戶態(tài)代碼添加到系統(tǒng)的唯一辦法,因此,一些程序員通過編寫設備驅動程序可以訪問OS的內部函數(shù)或者內部數(shù)據結構。
好,到此為止我們對windows2000的整體結構有了大概的了解,在接下來的日子里我們要對每個部分進行更為深入的研究,并且會舉一些例子程序來輔助說明,因為我們學它的目的就是為了用,為了改變!