需求和設計目標
? ? Windows NT設計小組在項目開始之初選擇了下面的設計目標:擴展性、可移植性、可靠性和健壯性、兼容性、性能。
操作系統模型
? ? 大多數多用戶操作系統中,應用程序與操作系統本身是隔離的。當用戶模式程序調用系統服務時,處理器執行一條特殊的指令,將調用線程切換到內核模式。當該系統服務完成時,操作系統將線程環境切換回用戶模式,允許調用者繼續執行。
? ? 與大多數Unix類似,Windows是一個龐大而完整的操作系統:操作系統的大部分代碼與設備驅動程序代碼共享同樣的受保護的內核模式內存空間。這意味著,操作系統的任一組件或者設備驅動程序都有可能破壞其他系統組件所使用的數據。然而,Windows實現了一些嚙內核保護機制,有助于減緩或避免與“共享內核模式地址空間”有關的問題發生。
? ? 當然,操作系統的所有組件都是完全受保護的,不會被錯誤的應用程序破壞,因為應用程序不能直接訪問操作系統中特權部分的代碼和數據(不過可以快捷的調用其他的內核服務)。
? ? Windows的內核模式組件也體現了基本的面向對象設計原則。
總體結構
? ? 用戶模式進程有如下四種基本類型:固定的(或者硬性指定的)系統支持進程,比如登錄進程和會話管理器;服務進程宿納的是Windows服務,Windows服務往往要求獨立于用戶登錄而運行;用戶應用程序;環境子系統服務器進程,實現了操作系統環境的支持部分,這里所謂的環境是指操作系統展示給用戶或者程序員的個性化部分。
? ? 在Windows下,用戶應用程序并不直接調用原生的Windows操作系統服務,而是通過一個或者多個子系統動態鏈接庫來發起調用。子系統DLL的角色是,將一個已文檔化的函數轉化為一些恰當的內部(通常是未文檔化)原生系統服務調用。
? ? Windows內核模式組件包含:Windows執行體包含了基本的操作系統服務,比如內存管理、進程和線程管理、安全性、I/O、網絡和跨進程通信;Windows內核是由一組低層次的操作系統功能構成的,比如線程調度、中斷和異常分發,以及多處理器同步,也提供了一組例程和基本對象;設備驅動程序 ,既包括硬件設備驅動程序,也包括像文件系統和網絡驅動程序之類的非硬件設備驅動程序;硬件抽象層(HAL)是指一層特殊的代碼,它把內核、設備驅動程序和Windows執行體的其余部分,跟與平臺相關的硬件差異隔離開來;窗口和圖形系統實現了圖形用戶界面功能,比如對窗口的處理、用戶界面控件以及繪制等。
? ? 可移植性。Windows有一個分層設計,系統的低層部分是與處理器體系架構相關的,或者是與平臺相關的,它們被隔離到獨立的模塊中,所系,系統的高層部分可以不考慮體系架構之間的差別,也不用關心硬件平臺的差異。內核和硬件抽象層為操作系統提供了可移植性。與體系架構相關的功能是在內核中實現的,在同樣的體系架構下,不同系統之間有所差異的功能則是在HAL中實現的。
? ? 對稱多處理(SMP)。多任務是指讓多個執行線程共享同一個處理器的操作系統技術。然而,當一臺計算機不止一個處理器時,可以同時執行多個線程。Windows設計的一個關機目標是,必須能夠很好的在多處理器計算機系統上運行。Windows是一個對稱多處理器操作系統。沒有主處理器——操作系統和用戶線程可以被調度到任何處理器上運行。而且,所有的處理器共享唯一的內存空間。這種模型與非對稱多處理器不同。
? ? 超線程是Intel引入的一項技術,它可以在每個物理核上提供多個邏輯處理器,每個邏輯處理器都有自己的cpu狀態,但是執行引擎和片上緩存則是共享的。這使得一個邏輯CPU可以在其他邏輯CPU停轉的時候繼續執行。調度算法已經被改進過了,因而可以最佳的利用支持超線程的機器。
? ? 在NUMA系統中,處理器被組織成更小的單元,稱為節點。每個節點有它自己的處理器和內存,并且通過一個緩存一致的互連總線連接到更大的系統上。NUMA系統上的Windows仍然作為一個SMP系統來運行,其中所有的處理器都可以訪問所有的內存,只不過,節點本地的內存訪問起來比其他節點的內存更快一些而已。
? ? Windows用一個位掩碼(有時候稱為親和性掩碼)來記錄和跟蹤處理器,這里位數與機器的原生數據類型相同,因而使得處理器可以直接在一個寄存器里操縱這些。由于這個原因,Windows系統最初限定了CPU個數在一個原生字的范圍內,因為親和性掩碼不能任意增長。為了保持兼容性,以及支持具有更多處理器的系統,Windows實現了一個更高級的概念,稱為處理器組,處理器組是指可以由一個親和性掩碼來定義的一組處理器,內核和應用程序在更改親和性設置的過程中可以選擇它們將使用哪一組。
? ? 可伸縮性。多處理器系統的一個關鍵問題是可伸縮性。為了在一個SMP系統上正確地運行,操作系統的代碼必須遵守嚴格的指示和規則。Windows集下面幾個特性于一身,這些特性對于Windows作為一個多處理器系統的成功起到了至關重要的作用:能夠在任何可用處理器上運行操作系統代碼,也可以同時在多個處理器上運行系統代碼;在單個進程內執行多個線程,每個線程可以在不同的處理器上并行執行;內核內部的細粒度同步,以及在設備驅動程序和服務器進程內部的細粒度同步,這使得更多的組件可以在多個處理器上并發的運行;諸如I/O完成端口之類的編程機制,使得可以實現高效的多線程服務器進程,并且這樣的進程在多處理器系統上有很好的可伸縮性。
關鍵的系統組件
? ? 環境子系統和子系統DLL。環境子系統的角色是,將基本的Windows執行體系統服務的某個子集暴露給應用程序。每個子系統都提供了對于Windows原生服務的一個不同子集的訪問能力。每個可執行映像都被綁定到一個且唯一的子系統上。映像文件運行時,負責創建進程的代碼會檢查該映像頭部的子系統類型代碼,所以可以通知正確的子系統,有新的進程被創建。
? ? 當應用程序調用子系統DLL中的某個函數時,可能會發生下述三件事情之一:該函數完全是在該子系統DLL中實現的,在用戶模式下運行;該函數要求調用Windows執行體一次或者多次;該函數要求在環境子系統進程中完成某些工作(環境子系統進程運行在用戶模式下,負責維護那些在其控制下運行的客戶應用程序的狀態)。有些函數可以是以上列出的第2和第3項的組合。
? ? 子系統啟動。子系統由會話管理器進程啟動起來的,子系統的啟動信息保存在注冊表鍵HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems的下面。Required值列出了系統引導時加載的子系統。Optional值表明了SUA子系統將會按需啟動。注冊表值Kmode包含了Windows子系統的內核模式部分的文件名稱,Win32k.sys。
? ? Windows子系統。盡管Windows在設計時,要求支持多個獨立的環境子系統,但是從實踐的角度來看,讓每個子系統都實現所有的代碼來處理窗口和顯示I/O,顯然會導致大量重復的系統函數。因為Windows是基礎的子系統,所以Windows的設計者決定將這些基本的功能放在Windows子系統中,讓其他子系統調用來完成顯示I/O。Windows子系統由以下主要組件構成。
????????對于每個會話,環境子系統進程(Csrss.exe)有一個實例加載三個DLL(Basesrv.dll、Winsrv.dll和Csrsrv.dll),它們包含下列支持:創建或刪除進程和線程;對16位DOS虛擬機(VDM)進程的部分支持(僅32位Windows);SxS(Side-by-Side)/Fusion和清單文件(Manifest)支持;其他一些函數,比如GetTempFile、DefineDOSDevice、ExitWindowsEx,以及幾個自然語言支持函數。
? ? ????內核模式設備驅動程序(Win32k.sys)包含下列支持:窗口管理器,控制窗口顯示,管理屏幕輸出,采集來自鍵盤、鼠標和其他設備的輸入,同時負責將用戶消息傳遞給應用程序;圖形設備接口,它是專門針對圖形輸出設備的函數庫,其中包括線段、文本和圖形的繪制函數,以及圖形控制函數;DirectX功能的包裝函數,Windows對DirectX的支持是在另一個內核驅動程序(Dxgkrnl.sys)中實現的。
? ? ????控制臺宿主進程(Conhost.exe),提供了對控制臺(字符環境)應用程序的支持。
? ? ????子系統DLL(比如Kernel32.dll、Advapi32.dll、User32.dll和Gdi32.dll),將已經文檔化的Windows API函數,轉譯成Ntoskrnl.exe和Win32k.sys中恰當的且絕大多數未文檔化的內核模式系統服務調用。
? ? ????圖形設備驅動程序,與硬件相關的圖形顯示器驅動程序、打印機驅動程序和視頻微端口驅動程序。
? ? ????因為子系統的大部分運行在內核模式下,所以,只有少數一些Windows函數要向Windows子系統進程發送消息:進程和線程的創建和終止、網絡驅動器號以及臨時文件的創建。