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 向高校和政府開放的用於研究的部分核心原始碼

## 參見

* Windows NT
* Windows 系統庫
* MinWin
* Linux 核心
* Unix 體系
* 作業系統核心比較
* 使用者模式驅動程式框架
* 核心模式驅動程式框架
* ReactOS

## 延伸閱讀

* 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 （頁面存檔備份，存於網際網路檔案館）