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