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 子系統。

1.1 Win32 環境子系統

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

1.2 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 程式的執行環境。

1.3 POSIX 環境子系統

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

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

核心模式

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

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

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

2.1 執行體

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）

提供了一種程序間通訊埠機制。是的基礎。

記憶體管理

管理虛擬記憶體，控制記憶體保護，以及物理記憶體與二級儲存之間的分頁排程，以及物理記憶體的分配。還能分析 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 移入了核心態，以提高圖形效能。

2.2 核心

核心（kernel）在 HAL 與執行體之間，實際上是 “微核心” 的理念下設計實現出來的。負責多處理器同步，執行緒與中斷的排程與分派，自陷處理，異常分派，在啟動時初始化裝置驅動程式等。

2.3 核心模式驅動

Windows NT 使用核心態的裝置驅動程式與硬體互動。使用者態下的程式看到的裝置都是 I/O 管理器下的檔案物件；而 I/O 管理器自身看到的裝置是裝置物件。核心態驅動程式分為 3 個層次： 最高層驅動程式，中層驅動程式，低層驅動程式。最高層驅動程式，如 FAT 或 NTFS 的檔案系統驅動程式，依賴於中層驅動程式。中層驅動程式由功能驅動（function driver）組成。功能驅動依賴於匯流排驅動，即服務於匯流排控制器、介面卡（adapter）、橋（bridge）的驅動。Windows Driver Model (WDM) 存在於中層。低層驅動直接控制硬體，不依賴於任何其他驅動程式。

2.4 硬體抽象層（HAL）

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

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