Windows NT體系結構

Windows NT體系結構是指一系列微軟設計及製造，由Windows NT所衍生出的視窗作業系統架構，採用使用者模式與核心模式的分層設計。它是一種是搶佔式和可重入的作業系統，可運行在單處理器或對稱多處理器（SMP）上。並利用I/O請求包和異步I/O來處理所有的I/O請求。微軟從Windows XP開始提供64位的Windows版本，之前只有32位版本。

使用者模式下的程式與子系統在它們可以訪問的系統資源方面受到限制，而核心模式對系統資源和外部設備的訪問不受限制，可以完全訪問電腦的硬體和系統資源。Windows NT內核是屬於混合核心；其體系結構包括簡單內核、硬體抽象層（HAL）、驅動程式、服務（總稱為執行體），它們都存在於內核模式中。

構成Windows NT使用者模式的子系統可以透過I/O管理器傳遞I/O請求給核心模式中適當的驅動程式。Windows NT的使用者模式由環境子系統（執行為不同類型作業系統編寫的應用程式）和集成子系統（Integral subsystem，代表環境子系統執行特定系統的功能）組成。內核模式阻止使用者模式的服務和應用程式訪問它們不應訪問的作業系統關鍵區域。

執行體與所有的使用者模式子系統處理I/O、對象管理、安全和進程管理。位於硬體抽象層與執行體之間的核心提供了多處理器同步、線程、中斷調度和分派、故障處理和例外分派的功能。內核還負責在啟動時初始化設備驅動程序。內核模式驅動程序分為三個級別：高層驅動程式、中層驅動程式和低層驅動程式。Windows驅動程式模型（WDM）位於中層，主要設計為在Windows 98與Windows 2000之間實現二進位檔與原始碼相容。最底層的驅動程序要麼是直接控制設備的舊版Windows NT設備驅動程序，要麼是即插即用硬體總線。

## 使用者模式

Windows NT作業系統的使用者模式部分包括兩個子系統：環境子系統與集成子系統。

環境子系統執行依據不同作業系統API而寫的程式，有三個環境子系統：Win32子系統、OS/2子系統、POSIX子系統。

### Win32環境子系統

Win32環境子系統可執行32位元的Windows應用程式，並為其他環境子系統提供具備純文字介面、關閉以及硬體錯誤(hard error)管理的主控台介面(console)，以及支援讓Windows NT執行MS-DOS與16位元Windows（Win16）程式的Virtual DOS Machine(VDMs)，其中有一個VDM擁有專屬的位址空間，專門用來模擬在Intel 80486平台上運行的MS-DOS 5.0環境。Win32環境子系統行程（csrss.exe）還包含了視窗管理員以處理像是由鍵盤或滑鼠觸發的輸入事件(event)，並將事件訊息(message)傳送至等待輸入回應的應用程式，應用程式則根據事件訊息作出相應的動作，例如繪制或刷新其視窗。

### OS/2環境子系統

OS/2環境子系統支援基於文字介面的16位元OS/2應用程式，或虛擬出來的OS/2 1.x。但執行在x86平台上OS/2 2.x及之後的非32位元或圖形化OS/2應用程式則不被支援。若要執行圖形化的OS/2 1.x程式，則需要安裝Windows NT Add-On Subsystem for Presentation Manager。最後一個具有OS/2子系統的是Windows 2000，從Windows XP開始則不再包含，但可透過在Windows XP上安裝Microsoft Virtual PC 2004取得OS/2程式的執行環境。

### POSIX環境子系統

POSIX環境子系統支持嚴格遵照POSIX.1標準及與ISO/IEC相關標準所寫的程式。這一子系統已經被Interix替代，屬於Windows Services for UNIX的一部分。

集成子系統包括安全子系統、工作站服務與伺服器服務。安全子系統處理安全令牌，基於資源許可授予或拒絕使用者帳戶訪問，處理登入請求與初始化登入驗證，以及管理Active Directory。工作站服務提供API給network redirector實作遠端網路存取的功能。伺服器服務則提供與網路服務相關的API。

## 核心模式

Windows NT的核心模式能訪問所有硬體資源，在保護記憶體區上執行代碼。控制了調度、線程優先級、記憶體管理、硬體交互；禁止了使用者態的程序與服務訪問關鍵資源，使用者態進程必須請求核心態執行這類操作。

x86硬體體系結構支持四種CPU優先級：0到3。僅有0與3這兩種優先級被Windows作業系統使用。使用者態程序運行在優先級3，核心態運行在優先級0（特權級別）。也分別稱作「ring 3」與「ring 0」。這使得具有了只有2個優先級的RISC平台的可移植性。但是打破了OS/2應用程式包含的I/O特權段的兼容性

核心態的作業系統包含了由許多功能模塊組成的執行體服務、內核驅動程序、一個（微）內核及一個硬體抽象層（HAL）。

### 執行體

Windows執行體服務建立於低層核心態程序之上，包含在文件NTOSKRNL.EXE中。負責處理I/O、對象管理、安全、進程管理，劃分為幾個子系統, 包括緩存管理、配置管理、I/O管理、本地過程調用（LPC）、記憶體管理、對象管理、進程結構與安全引用監視（SRM）。這些子系統一起構成了執行體服務。系統服務，即系統調用也是在這一級別上實現，除了極少特例為了高性能而直接調用了內核層。

上下文中的術語「service」是指可調用的例程，或一整套可調用的例程。這不同於「服務進程」（service process）。服務進程是使用者態下的程序，類似於類Unix系統的守護進程。

對象管理器：對象管理器是一個執行體的子系統，所有其他的執行體子系統，特別是系統調用必須通過它來獲得對Windows NT資源的訪問，這使得對象管理器成為資源管理的基礎設施。對象管理器用來避免在其他子系統中管理資源帶來的冗餘與不安全。在對象管理器視角，每個資源都是一個對象，不論是物理資源（如文件系統或外設），還是邏輯資源（如一個互斥鎖）。

緩存控制器：Windows Cache Manager與記憶體控制器、I/O控制器、I/O驅動一起為正常的文件I/O提供緩存。這種文件緩存是針對文件塊，對本地文件與遠程文件提供了一致的服務。實際上這是特殊的文件記憶體映射。

配置管理器：實現了Windows註冊表所需的系統調用。

I/O管理器：允許用戶態程序與設備的通信。I/O管理器把使用者態程序的讀寫請求翻譯給硬體。例如，I/O管理器接收文件系統I/O請求，翻譯為對相關設備的調用，與低層設備驅動程序合作執行硬體讀寫操作。還包括了I/O操作的cache管理。

本地過程調用（LPC）：提供了一種進程間通信埠機制。是Microsoft RPC的基礎。

記憶體管理：管理虛擬內存, 控制記憶體保護，以及物理記憶體與二級存儲之間的分頁調度, 以及物理記憶體的分配。還能分析PE格式可執行程序，以便映射入或卸載這些程序。

進程結構：處理進程與線程的創建與終止，實現了作業概念（從Windows 2000開始）。

即插即用管理器：處理即插即用，支持在啟動時的設備檢測與安裝，按需停止或啟動一個設備。它的大部分實際上是在使用者態的 「Plug and Play」服務中實現。

電源管理：處理電源事件（關機、睡眠stand-by、休眠等），通知受影響的驅動程序。

安全引用監視（SRM）：強制實行安全規則的子系統。通過訪問控制表（ACLs）確定一個對象或資源可以被訪問。訪問控制表由訪問控制條目(ACEs)組成。ACE包含了安全標識符（SID）與授予的操作列表，使得使用者帳戶、使用者組帳號、登錄會話具有對資源的允許、不允許、審核（audit）等權限.

GDI：圖形設備接口是負責畫線、字體繪製、處理調色板等。在Windows NT 3.x系列作業系統，GDI屬於使用者態。從Windows NT 4.0，GDI移入了核心態，以提高圖形性能。

### 內核

內核（kernel）在HAL與執行體之間，實際上是「微內核」的理念下設計實現出來的。負責多處理器同步，線程與中斷的調度與分派，自陷處理，異常分派，在啟動時初始化設備驅動程序等。

### 核心模式驅動

Windows NT使用核心態的設備驅動程序與硬體交互。使用者態下的程序看到的設備都是I/O管理器下的文件對象；而I/O管理器自身看到的設備是設備對象。核心態驅動程序分為3個層次：最高層驅動程序，中層驅動程序，低層驅動程序。最高層驅動程序，如FAT或NTFS的文件系統驅動程序，依賴於中層驅動程序。中層驅動程序由功能驅動（function driver）組成。功能驅動依賴於總線驅動，即服務於總線控制器、適配器（adapter）、橋（bridge）的驅動。Windows Driver Model (WDM)存在於中層。低層驅動直接控制硬體，不依賴於任何其他驅動程序。

### 硬體抽象層（HAL）

硬體抽象是一套軟體子程序（routine），模擬了特定平台有關細節，使得程序不必直接訪問硬體資源。因而可以寫獨立於設備的、高性能代碼，通過作業系統訪問硬體。例如，編譯器屏蔽了CPU指令集的細節，應用程式作者無需考慮與CPU相關的指令。作業系統的硬體抽象使得程序只需調用作業系統級的操作，而屏蔽了硬體具體細節，使得程序具有了可移植性。

作業系統的硬體抽象層位於硬體與軟體之間。對作業系統內核隱藏了硬體的大部分差異，使得核心態代碼基本不需要改變即可運行於不同硬體配置的電腦上。硬體抽象大都是硬體驅動程序。被屏蔽的硬體資訊包括I/O界面、中斷設置、多處理器通信機制等。

## 內核源碼參考

可從下述渠道獲得Windows內核的實現源碼的參考：

- ReactOS：類Windows的開源作業系統，與Windows在 API級別兼容
- wine：在非Windows系統上運行Win32程序的開源中間層，邏輯上與Windows在 API 級別兼容
- Windows Research Kernel：Microsoft向高校和政府開放的用於研究的部分內核源碼

## 延伸閱讀

- Martignetti, E.; What Makes It Page?: The Windows 7 (x64) Virtual Memory Manager (ISBN 978-1479114290)
- Russinovich, Mark E.; Solomon, David A.; Ionescu, A.; Windows Internals, Part1: Covering Windows Server 2008 R2 and Windows 7 (ISBN 978-0735648739)
- Russinovich, Mark E.; Solomon, David A.; Ionescu, A.; Windows Internals, Part2: Covering Windows Server 2008 R2 and Windows 7 (ISBN 978-0735665873)

## 注釋與參考文獻

引用

參考

## 外部連結

- Microsoft's official Windows 2000 site
- Windows 2000 Plug and Play architecture
- Memory management in the Windows XP kernel