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