《深入解析Windows作業系統》讀書筆記(2)

來源:互聯網
上載者:User

Windows NT設計小組在項目開始之初確定的設計目標:

  • 擴充性。在市場需求變化後能夠自如的增長和改變。
  • 可移植性。必須能運行在多種硬體體繫結構上,出現新的硬體體繫結構後,應該可以很容易遷移。
  • 可靠性和健壯性。系統應該能夠保護自己,不能因內部的錯誤和外部的篡改而不能工作。應用程式應該無法傷害作業系統或者其他的應用程式。
  • 相容性。和MS之前的作業系統相容,包括DOS、Winsows98等;要和其他的作業系統相容,包括OS/2和NerWare。
  • 效能。在其他目標的約束下,儘可能快。

Windows NT不是微核心系統。微核心系統中,主要組件運行在各自獨立的進程中,它們有自己私人的地址控制項,在這一組組件之上是微核心提供的一組原語服務。純粹的微核心設計在商業上是不切實際的,由於需要不停的在核心模式和使用者模式之間進行切換,所以效率是很低的。

Windows是一個對稱式多處理(SMP,Sysmmetric multiprocessing)作業系統,在這些處理器中沒有主處理器,所有的處理器共用唯一的記憶體空間。

Windows NT整體結構分成使用者模式和核心模式兩部分。使用者模式主要包括一些進程以及子系統DLL;核心模式包括Windows執行體、Windows核心、裝置驅動程式、硬體抽象層和視窗圖形系統。

使用者模式下的進程分為以下四種:

  • 系統支援進程。例如登陸或者進程管理器,這些進程並不是Windows的服務,它們不是由服務管理員來啟動的。
  • 服務進程。指Windows服務,它的運行一般獨立於使用者登陸。
  • 使用者應用程式。
  • 環境子系統伺服器處理序。實現了作業系統環境的支援部分。這裡的環境是指作業系統展示給使用者或者程式員的個人化部分。

在Windows下,使用者應用程式並不直接調用原始的Windows作業系統服務,而是通過一個或者多個子系統動態連結程式庫(DLLs)來發起調用。

子系統DLL的角色:將一個已文檔化的函數轉化為一些恰當的內部Windows系統服務調用。

核心模式組件包括以下幾部分:

  • Windows執行體(executive)。包含了基本的作業系統服務,例如記憶體管理、進程和線程管理、安全性、I/O、網路和跨進程通訊。
  • Windows核心(kernel)。由一組低層次的作業系統功能構成,例如線程調度、中斷和異常分發。它也提供了一組常式和基本對象。執行的其餘部分利用這些常式和對象實現更高層次的功能。
  • 裝置驅動程式(device drivers)。既包括硬體裝置驅動程式,也包括檔案系統和網路驅動程式。其中硬體裝置卻動程式將使用者的I/O函數調用轉換成特定的硬體裝置I/O請求。
  • 硬體抽象層(HAL,Hardware Abstraction Layer)。一層特殊的代碼,它把核心、裝置驅動程式和Windows執行體的其餘部分,跟與平台相關的硬體差異隔離開來。
  • 視窗和圖形系統(windowing and graphic system)。實現了圖形化使用者介面(GUI)函數,例如對視窗的處理、使用者介面控制項等。

Windows系統對於可移植性的支援,體現在以下兩方面:

  • 採取分層設計。系統的高層部分可以不考慮體繫結構之間的差別,也不用關心硬體平台的差異。
  • Windows的絕大部分代碼使用C語言編寫,少部分用c++編寫,極少部分採用彙編。

Windows最初有3個環境子系統:OS/2、POSIX和Windows。3個子系統中Windows子系統是很特殊的,Windows非它不能運行,其他兩個子系統被配置成按需啟動,而Windows子系統則必須總是在運行。

環境子系統啟動資訊背包存在註冊表鍵HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems下。

環境子系統的角色:將Windows基本系統服務的部分子集暴露給應用程式。每個子系統都提供了對於Windows原生服務不同部分的訪問能力,這意味著建立在某一個子系統上的應用程式可以做到的事情,是另一個建立在不同子系統上的應用無法做到的。不同的子系統之間,函數調用不能混合。

當一個應用程式調用子系統DLL中的某個函數時,情況分為以下三種:

  • 該函數完全是在該子系統DLL中實現的,在使用者模式下運行。
  • 該函數要求調用Windows執行體一次或者多次。
  • 該函數要求在環境子系統進程中完成某些工作在這種情況下,該函數以訊息的形式給環境子系統發送一個客戶/伺服器請求,從而讓環境子系統執行某個操作,然後子系統DLL等待應答,收到應答後再返回給調用者。

Windows子系統由以下幾個主要組件構成:

  • 環境子系統進程(Csrss.exe)。包括:1. 控制台視窗;2. 建立或刪除進程和線程;3. 對16位虛擬DOS機進程的一部分支援;4. 其他的一些函數,例如GetTempFile、DefineDosDevice等。
  • 核心模式裝置驅動程式(Win32k.sys)。包括:1. 視窗管理器;2. 圖形裝置介面。
  • 子系統DLL。它們將已經文檔化的Windows API函數,翻譯成Ntoskrnl.exe和Win32k.sys中恰當的且絕大部分未文檔化的核心模式系統服務調用。
  • 圖形裝置驅動程式。指與硬體相關的圖形顯示器驅動程式。印表機驅動程式和視頻微連接埠驅動程式。

應用程式調用標準的USERS函數以便在顯示器上建立使用者介面控制項,視窗管理器將這些請求發送給GDI,GDI將它們傳遞給圖形裝置驅動程式,在裝置驅動程式內部,這些請求被經過格式化以適合特定的顯示器裝置,顯示器驅動與視頻微連接埠驅動程式是成對的,以實現對視頻顯示的支援。

GDI函數位於應用程式和圖形裝置的而中間。負責解釋應用程式的圖形輸出請求,並且將這些請求發送給圖形顯示器驅動程式。

在Windows NT4中,將原本運行在Windows子系統進程環境中的視窗和圖形代碼移到了一組可調用的系統服務中,直接運行在核心模式下。這樣做的原因是為了提高總體系統效能,把Windows圖形子系統放在一個分開的伺服器處理序中,必將導致多次線程和進程環境的切換,從而消耗掉相當數量的CPU周期和記憶體資源。

Ntdll.dll:一個特殊的系統支援庫,主用用於子系統DLL。它包含兩種類型的函數:1. 系統服務分發存根,他們會調用Windows執行體系統服務;2. 內部支援函數,供子系統、子系統DLL以及其他原生映像檔案使用。

系統服務分發存根為Windows執行體系統服務提供了介面,在使用者模式下可以通過這些介面函數調用Windows執行體的系統服務。對於每一個這樣的函數,Ntdll包含了一個同名的進入點,函數內部的程式碼封裝含了與處理器體繫結構相關的模式切換指令,通過該指令可轉換到核心模式下,從而調用系統服務分發器,分發器在鍵校了某些參數以後,再調用真正的核心模式系統服務。

Windows執行體是Ntoskrnl.exe中的上層,它包括以下類型的函數:

  • 可以再使用者模式下調用的匯出函數,這些函數被稱為系統服務,並且通過Ntdll被匯出,這些服務絕大部分可以通過Windows API來訪問,或者通過另一個環境子系統的API來訪問。
  • 可以通過DeviceIpControl函數來調用的裝置磁碟機函數。
  • 只能在核心模式下調用的匯出函數,並且這些函數在Windows DDK或者Windows IFS Kit中已經被文檔化。
  • 在核心模式下調用,但未在Windows DDK或者Windows IFS Kit中文檔化的匯出函數。
  • 定義為全域符號但是未被匯出的函數。
  • 未定義為全域符號,而是在一個模組內部的函數。

Windows執行體包含了以下主要的組件:

  • 組態管理員。負責系統註冊表的實現和管理。
  • 進程和線程管理器。建立或者種植進程和線程。
  • 安全引用監視器。強制在本機電腦上實行安全性原則。
  • I/O管理器。實現與裝置無關的I/O操作,負責將這些操作指派到恰當的裝置驅動程式以供進一步處理。
  • 隨插即用(PnP)管理器。根據每個裝置的資源需求,分配適當的硬體資源,例如IRQ、DMA通道和記憶體位置等。
  • 電源管理器。負責協調電源事件,並且向裝置驅動程式產生電源管理I/O通知。
  • WDM Windows管理規範常式。允許裝置驅動程式發行就緒有關效能和配置的資訊,以及接收來自使用者模式WMI服務的命令。
  • 快取管理器。通過讓最近因用過的磁碟資料駐留在記憶體中以便快速存取的方法提高了以檔案愛你為基礎的I/O操作的效能。
  • 記憶體管理器。實現了虛擬記憶體。
  • 邏輯預取器。加速系統和進程的啟動過程。

Windows執行體包含4組主要的支援函數,分別是:

  • 對象管理器
  • LPC設施:在同一台機器上的客戶進程和伺服器處理序之間傳遞資訊,LPC是RPC的一個更加靈活的最佳化版本。
  • 一組涉及範圍管飯的公用運行庫函數。
  • 執行體支援常式。

核心是由Ntoskrnl.exe中的一組函數以及對於硬體體繫結構的低層支援構成的。Ntoskrnl.exe中的這組函數提供了一些最為基本的機制,例如線程調度和同步服務;而對硬體的低層支援則隨著每個處理器結構的不同而有所區別。核心代碼主要是C語言編寫,對於那些要用到特殊的處理器指令和寄存器,並且不容易在C代碼中訪問的任務,則保留使用彙編代碼的形式。

核心提供了一組定義明確的、可預知的作業系統低層原語和機制,從而使得執行體中的高層組件可以做它們需要做的事情。核心實現了作業系統的基本機制,並且避免了各種策略決定,從而將自己與執行體的其餘部分分離開。它幾乎將所有的策略決定都留給了執行體,唯一的例外就是線程調度和分發,這是由核心自己來實現的。

核心實現了一組更簡單的而對象,成為核心對象,它們協助核心控制好中心處理過程,並且支援執行體對象的建立工作。執行體層的絕大多數對象封裝了一個或者多個核心對象,把它們的核心屬性合并起來。

核心的另一個重要任務就是將執行體和裝置驅動程式從Windows所支援的各種硬體體繫結構中抽象出來,或者隔離出這些變種之間的差異,即便是對這些與硬體相關的功能,在設計核心的時候也試圖是公用代碼儘可能的最大化。這些與體繫結構杜麗的介面可以再任何一台機器上被調用,而且無論是先代碼是否隨著體繫結構的不同而不同,介面的語義總是相同的。

HAL是一個可載入的、核心模式的模組,它提供了針對Windows當前運行所在的硬體平台的底層介面,它隱藏了與硬體相關的細節。

裝置驅動程式是可載入的核心模式模組,它們在I/O管理器和相應的硬體之間建立起連結。

裝置驅動程式運行在核心模式下,位於以下三種執行環境之一:

  • 在發起I/O功能的使用者線程的環境中。
  • 在核心模式的系統線程的環境中。
  • 作為一個中斷的結果。

Windows中的裝置驅動程式並不直接維護硬體,而是調用HAL中函數與硬體進行互動。

裝置驅動程式可以分為以下幾類:

  • 硬體裝置驅動程式。
  • 檔案系統驅動程式。
  • 檔案系統過濾器驅動程式。
  • 網路重新導向和伺服器。
  • 協議驅動程式。
  • 核心流式過濾器驅動程式。

要想在系統中添加使用者編寫的核心模式代碼,安裝驅動程式是唯一的方法,所以有些程式員把編寫裝置驅動程式當做是一種訪問作業系統內建函式和資料結構的漸層方法。

目前,新的驅動程式模型是WDM(Windows Driver Model),從WDM的角度來看,驅動程式可以分為以下三種:

  • 匯流排型驅動程式。它為匯流排控制器、適配器、橋或者任何帶有子裝置的裝置提供服務。匯流排驅動程式是必需的驅動程式,通常Microsoft會提供此類驅動程式。
  • 功能型驅動程式。它是主要的裝置驅動程式,為相應的裝置提供了可操作的介面,功能型驅動也是必需的,它最瞭解某一特定的裝置,而且它往往是唯一能訪問與該裝置相關的寄存器的驅動程式。
  • 過濾型驅動程式。它用來為某一裝置增加新的功能,或者修改來自其他裝置的I/O請求或應答,過濾型驅動程式是可選的,可以有任意數目。

在WDM驅動環境中,對於一個裝置來說,並不是由單個驅動程式來控制它的所有方面:一個匯流排型驅動程式負責向PnP管理器報告其匯流排上的裝置,而一個功能型驅動程式操縱該裝置。

在大多數情況下,低層次的過濾型驅動程式改變裝置硬體的行為,上層的過濾型驅動程式為一個裝置提供一些增值特性。

以下的系統進程會出現在每一個Windows系統中:

  • 空閑進程(Idle)。
  • 會話管理器(Smss.exe)。
  • Windows子系統(Csrss.exe)。
  • 登陸進程(Winlogon.exe)。
  • 服務控制管理員(Services.exe)和它建立的子服務進程(例如系統提供的泛型服務宿主進程Svchost.exe)。
  • 本地安全證明伺服器(Lsass.exe)。

System進程是一個特殊線程的母體,這種特殊線程只能在核心模式下運行,稱為核心模式系統線程。系統線程具備普通使用者模式線程的所有屬性和環境,但是不同的地方在於,他們只在核心模式下運行系統空間中載入的代碼,無論這些代碼是在Ntoskrnl.exe中,還是在任何其他載入進來的裝置驅動程式。

核心會建立一個稱為平衡集管理器的系統線程,它美妙被喚醒一次,從而有可能發出各種與調度和記憶體管理相關的事件。

會話管理器是系統中第一個建立的使用者模式進程,負責完成執行體和核心初始化工作的核心模式系統線程在最後階段建立了實際的Smss進程。

進入Windows系統的過程:首先啟動Winlogon進程,等待輸入使用者名稱和密碼或者其他輸入;然後通過LSASS調用適當的認證包以執行實際的驗證操作;在成功驗證後,LSASS調用安全引用監視器中的一個函數,以產生一個存取權杖對象,該對象包含了目前使用者的安全輪廓,接著,Winlogon利用次存取權杖來建立該使用者會話中的初始進程;Userinit執行該使用者環境中的一些初始化工作,然後在註冊表中尋找shell值,並且建立一個進程來運行系統定義的外殼程式(預設是Explorer.exe);最後Userinit退出,這也就說明了為什麼Explorer.exe在進程樹中沒有父進程的原因。

Winlogon不僅當使用者登入和登出時是活動的,而且無論合適,當它截取到鍵盤上的SAS(Ctrl + Alt + Del)時也是活動的。

Windows中的“服務”既可以指一個伺服器處理序,也可以指一個裝置驅動程式。

服務控制管理員是一個特殊的系統進程,它啟動並執行影響檔案是\Windows\System32\Services.exe,它負責啟動、停止服務進程,也負責與這些服務進程進行互動,所謂服務程式,實際上只是調用了一些特殊Windows函數的Windows映像。

服務一般有三個名稱:你在系統中看到的正在啟動並執行進程名、註冊表中的內部名稱和在Services管理工具中給出的顯示名。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.