Windows NT 中的 NT 意为 New Technology ,其实 Microsoft 自从 93 年推出的第一个 windows NT 3.1 到即将发布的 windows 7 都属于 NT 版本的范畴,只不过是 Windows 2000 之后的版本不再以内核版本号命名。
Microsoft Windows NT 3.1 (1993)
Microsoft Windows NT 3.5 (1994)
Microsoft Windows NT 3.51 (1995)
Microsoft Windows NT 4.0 (1996)
Microsoft Windows 2000 (Windows NT 5.0) (1999)
Microsoft Windows XP (Windows NT 5.1) (2001)
Microsoft Windows Server 2003 (Windows NT 5.2) (2003)
Microsoft Windows Vista (Windows NT 6.0) (2006)
Microsoft Windows Server 2008 (Windows NT 6.1) (2008)
Microsoft Windows 7 (Windows NT 6.1) (2009 夏末发布 )
 
NT 体系中最大的特点莫过于系统分为内核模式与用户模式,在这里就着重谈一下这两个模式的特点。
使用内核模式或者用户模式是由硬件控制的处理器状态, NT 利用硬件的特性对内存的访问进行控制。其中对内存页面的读写控制主要体现在 3 方面:保护系统页面,用户程序不可访问。避免了由于用户程序错误对系统页面的影响;用户进程相互之间的保护,隔离用户进程避免相互干扰;对代码区域的“不可写”保护。
内核模式和用户模式能够执行的指令也有区别,特权指令只能在内核模式下运行,用户模式下并不能使用 CPU 提供的所有功能。
Windows NT 使用的模式可以用 Performance Monitor 查看 Processor 对象的两个计数器 ”Privileged Time” ”User Time” ,可看到 CPU 在内核模式和用户模式下所花的时间。


两种模式的状态何时切换呢?切换发生在系统调用或者中断发生时。
系统调用:当应用程序调用系统功能时,从用户模式切换到内核模式。调用完成后返回用户模式。
中断发生:直接进入内核模式。

两种模式与线程有何种关系呢?线程可以在两种模式之间来回切换, CPU 的运行模式和线程调度没有必然联系。
 

一、谈到 Windows 体系结构以及它的两种模式,就不得不提到 Windows 子系统。因为正是由众多 Windows 子系统所组成的内核模式和用户模式最终构成了 Window 操作系统的整个体系结构。示意图如下所示,
1 、内核
Ntoskrnl.exe NT 体系结构中最核心的部分)
1 )、执行体功能:进程和线程管理器、虚拟内存管理器、安全引用监视器 (Security Reference Monitor) I/O 管理器、即插即用管理器、电源管理器、缓存管理器、其他一些服务组件,比如对象管理器、 LPC 、一些库函数和支持函数。
2 )、内核功能:供其他组件使用的底层操作系统、线程调度、中断处理、多处理器的同步。
此外 Ntkrnlpa.exe  支持 PAE( 物理地址扩展 ) 的执行体和内核 特殊版本的内核,用于在 32 位系统对超过 4GB 物理内存寻址的内核。

2、 硬件抽象层( HAL
硬件抽象层用于屏蔽硬件的差异,保证内核在任何硬件环境下保持可移植性,在内核不变的情况下可更换硬件。它对硬件平台的细节进行了抽象,包括 I/O 接口,中断控制器等
Windows 2000/XP/2003 支持如下几种硬件结构
Hal.dll  标准 PC
Halacpi.dll 高级配置和电源接口 (APIC)PC
Halapic.dll 高级可编程中断控制器 (APIC)PC
Halaacpi.dll APIC ACPI PC
Halmps.dll 多处理器 PC
Halmacpi.dll 多处理器 ACPI PC

3 I/O 管理器
1 )、 Windows I/O 管理结构灵活,它将磁盘 I/O 、网络 I/O 等抽象成 IRP I/O 请求包)。所以 I/O 管理器是一个用于传递 IRP 的框架,通过 IRP 控制了所有 I/O 操作的处理过程(唯一的例外:快速 I/O 不使用 IRP
2 )、 I/O 管理器工作过程:
> 为每个 I/O 操作创建一个 IRP
> IRP 传递给正确的驱动程序
> I/O 操作完成时删除 IRP
3 )、驱动程序与 I/O 管理器的关系:
> I/O 管理器登记必要的信息
> 接收 IRP
> 执行 IRP 指定的操作
> IRP 传回给 I/O 管理器,或者通过 I/O 管理器传递给另一个驱动程序以便进一步处理。

4 、内核模式驱动程序 Win32k.sys
Win32k.sys 包括窗口管理器和图形设备接口 GDI ,其作用是高效的处理用户图形界面,灵活的管理窗口。
1 )、窗口管理器。控制窗口显示、管理屏幕输出、收集来自键盘鼠标和其它设备的输入、把用户消息传递给应用程序。
2 )、图形设备接口 (GDI) 。这是针对图形输出设备的函数库,包括画线、文本和各种图形的函数,以及一些用于控制图形操作的函数。

5 、环境子系统进程
Win32 子系统进程 csrss.exe 作用包括控制台窗口、创建或删除进程或线程、对 16 位虚拟 DOS 机的支持。
注:对 OS/2 POSIX 的支持通过其他方式支持,这里不再说明。

6 、子系统 DLL
子系统 DLL 包括 Kernel32 Advapi32 User32 GDI32 等,为 Windows 应用程序调用系统服务和 Win32 子系统提供接口模块。

7 Ntdll.dll
内部支持函数和执行体函数的存根函数,将用户模式的请求转译为内核模式,在这一层上 CPU 进行环境切换 (sysenter/sysexit)
用户程序与系统的交互也就是用户模式和内核模式的切换方式如下,
1 )、用户程序通过子系统直接调用内核执行体所提供的函数
2 )、用户程序通过子系统调用 Win32 User/GDI ,直接从用户模式切换到内核模式,调用完成后返回。
3 )、用户程序通过环境子系统 csrss.exe ,相对过程要经过 4 次环境切换,效率较低。

8 、系统进程和系统线程
Smss.exe Winlogon.exe Services.exe
 

 二、

对于 Windows Vista(Windows NT 6.0) 在内核上的变化下面简要介绍一下
1、  线程调度更加公平:更精确地计算线程执行时间,按照线程执行时间而不是时间点调度。
2、  I/O 系统的改进
1 )、 I/O 完成端口的改进: I/O 完成端口用于提高系统对 I/O 处理的吞吐量。之前的版本每次完成都立即切换到发出 I/O 的那个线程,而不管该线程是否需要 I/O 完成的结果。在 Vista 中,延迟到该线程来读取或者处理此 I/O 请求,从而避免了不必要的线程环境切换。
2 )、同步 I/O 可以被取消:既可以取消当前线程发出的 I/O ,又可以取消其他线程发出的 I/O 。比如系统的文件对话框都支持取消操作,访问远程计算机时在等待连接过程中都可以取消,避免了由于网络路径不可用需要等到连接超时之后才能进行下一步操作。
3 )、 I/O 优先级的改进:
之前版本的 I/O 优先级都是根据线程 I/O 优先级来确定, Vista 引入了两种 I/O 优先级类型 --I/O 优先级和 I/O 带宽预留。这样使得后台任务更少的干扰前台任务。

3、  内存管理的改进
1 )、内存池的大小可以是动态的:在 32 Vista 系统中,虚拟内存的分配可以根据需要动态变化。主要针对换页内存池、非换页内存池和会话内存池。
2 )、 SuperFetch :对应 XP 中的 Prefetcher Prefetcher 在进程启动时候针对单个进程来预取数据。例如启动 Word 这样比较大的程序时,如果不使用 Prefetcher 预先处理进程 WINWORD.EXE 启动效率会非常低, Prefetcher 可以对每个程序预留内存页面以提高进程启动的速度。在 Vista 中, SuperTetch 能够根据更加复杂的模式来预取数据,例如可以跨越多个应用程序。
3 )、 ReadyBoost :支持用 Flash (闪存)来缓存,介于 RAM 和硬盘之间,数据可以被压缩和加密。如果是顺序访问, Flash 的速度不如硬盘。但对于缓存的访问常是随机的, Flash 的性能优于硬盘。

4、  ReadyBoot 引导和停机
1 )、使用引导配置数据库替代了 Boot.ini ,存储在注册表中              
HKEY_LOCAL_MACHINE\BCD00000000.
2 )、使用两个引导程序替代了 Ntldr(NT Loader) ,分别是 Windows Boot Manager(\Bootmgr) OS loader(\Systemroot\System32\Winload.exe)
3 )、启动过程和会话管理方面的改进:对于系统会话和控制台用户会话进行隔离,使用不同的会话。
4 )、停机过程的改进:服务可以请求停机等待,也可以指定服务的停机顺序。

5、  可靠性和系统恢复
1 )、内核事务管理器( KTM ):用于协调应用程序和资源管理器(包括注册表和 NTFS 文件系统)
2 )、卷影拷贝( Volume Shadow Copy
XP 中已经引入,主要用于备份工具
Server 2003 中用于共享文件夹的影像拷贝,作版本的管理。
Vista 中,卷影拷贝服务可以用于系统恢复( System Restore ),更加灵活。
3 )、 Windows 错误报告( Windows Error Reporting ):之前,未处理的异常是在异常线程环境中执行的,可能会因为该异常线程本身导致发不出错误报告。 Vista 中,线程发送一个消息,由 WER 服务处理。

6、  安全性
1 )、 BitLocker 驱动器加密:对整个 OS 卷进行加密(要求有 1.5G 为加密的系统卷)
2 )、代码完整性检验( Code Integrity Verification ):对 OS Loader 和内核执行代码签名的检查。
3 )、地址空间布局随机化( Address Space Load Randomization ASLR ):子系统 DLL 在用户进程的地址空间不再是固定的地址位置,用户栈的位置是随机的,减少了缓冲区溢出***。
4 )、 Windows 服务的安全增强:使用“最小特权原则( the principle of least-privilege )”。
5 )、 UAC (用户帐户控制, User Account Control ):管理员组成员在运行程序时并不是特权用户,而是使用标准用户权限。当需要安装程序或访问系统数据时,系统会对操作进行提示。 1 、内核
Ntoskrnl.exe NT 体系结构中最核心的部分)
1 )、执行体功能:进程和线程管理器、虚拟内存管理器、安全引用监视器 (Security Reference Monitor) I/O 管理器、即插即用管理器、电源管理器、缓存管理器、其他一些服务组件,比如对象管理器、 LPC 、一些库函数和支持函数。
2 )、内核功能:供其他组件使用的底层操作系统、线程调度、中断处理、多处理器的同步。
此外 Ntkrnlpa.exe  支持 PAE( 物理地址扩展 ) 的执行体和内核 特殊版本的内核,用于在 32 位系统对超过 4GB 物理内存寻址的内核。

2 硬件抽象层( HAL
硬件抽象层用于屏蔽硬件的差异,保证内核在任何硬件环境下保持可移植性,在内核不变的情况下可更换硬件。它对硬件平台的细节进行了抽象,包括 I/O 接口,中断控制器等
Windows 2000/XP/2003 支持如下几种硬件结构
Hal.dll  标准 PC
Halacpi.dll 高级配置和电源接口 (APIC)PC
Halapic.dll 高级可编程中断控制器 (APIC)PC
Halaacpi.dll APIC ACPI PC
Halmps.dll 多处理器 PC
Halmacpi.dll 多处理器 ACPI PC

3 I/O 管理器
1 )、 Windows I/O 管理结构灵活,它将磁盘 I/O 、网络 I/O 等抽象成 IRP I/O 请求包)。所以 I/O 管理器是一个用于传递 IRP 的框架,通过 IRP 控制了所有 I/O 操作的处理过程(唯一的例外:快速 I/O 不使用 IRP
2 )、 I/O 管理器工作过程:
> 为每个 I/O 操作创建一个 IRP
> IRP 传递给正确的驱动程序
> I/O 操作完成时删除 IRP
3 )、驱动程序与 I/O 管理器的关系:
> I/O 管理器登记必要的信息
> 接收 IRP
> 执行 IRP 指定的操作
> IRP 传回给 I/O 管理器,或者通过 I/O 管理器传递给另一个驱动程序以便进一步处理。

4 、内核模式驱动程序 Win32k.sys
Win32k.sys 包括窗口管理器和图形设备接口 GDI ,其作用是高效的处理用户图形界面,灵活的管理窗口。
1 )、窗口管理器。控制窗口显示、管理屏幕输出、收集来自键盘鼠标和其它设备的输入、把用户消息传递给应用程序。
2 )、图形设备接口 (GDI) 。这是针对图形输出设备的函数库,包括画线、文本和各种图形的函数,以及一些用于控制图形操作的函数。

5 、环境子系统进程
Win32 子系统进程 csrss.exe 作用包括控制台窗口、创建或删除进程或线程、对 16 位虚拟 DOS 机的支持。
注:对 OS/2 POSIX 的支持通过其他方式支持,这里不再说明。

6 、子系统 DLL
子系统 DLL 包括 Kernel32 Advapi32 User32 GDI32 等,为 Windows 应用程序调用系统服务和 Win32 子系统提供接口模块。

7 Ntdll.dll
内部支持函数和执行体函数的存根函数,将用户模式的请求转译为内核模式,在这一层上 CPU 进行环境切换 (sysenter/sysexit)
用户程序与系统的交互也就是用户模式和内核模式的切换方式如下,
1 )、用户程序通过子系统直接调用内核执行体所提供的函数
2 )、用户程序通过子系统调用 Win32 User/GDI ,直接从用户模式切换到内核模式,调用完成后返回。
3 )、用户程序通过环境子系统 csrss.exe ,相对过程要经过 4 次环境切换,效率较低。

8 、系统进程和系统线程
Smss.exe Winlogon.exe Services.exe

 

二、对于 Windows Vista(Windows NT 6.0) 在内核上的变化下面简要介绍一下
1、  线程调度更加公平:更精确地计算线程执行时间,按照线程执行时间而不是时间点调度。
2、  I/O 系统的改进
1 )、 I/O 完成端口的改进: I/O 完成端口用于提高系统对 I/O 处理的吞吐量。之前的版本每次完成都立即切换到发出 I/O 的那个线程,而不管该线程是否需要 I/O 完成的结果。在 Vista 中,延迟到该线程来读取或者处理此 I/O 请求,从而避免了不必要的线程环境切换。
2 )、同步 I/O 可以被取消:既可以取消当前线程发出的 I/O ,又可以取消其他线程发出的 I/O 。比如系统的文件对话框都支持取消操作,访问远程计算机时在等待连接过程中都可以取消,避免了由于网络路径不可用需要等到连接超时之后才能进行下一步操作。
3 )、 I/O 优先级的改进:
之前版本的 I/O 优先级都是根据线程 I/O 优先级来确定, Vista 引入了两种 I/O 优先级类型 --I/O 优先级和 I/O 带宽预留。这样使得后台任务更少的干扰前台任务。

3、  内存管理的改进
1 )、内存池的大小可以是动态的:在 32 Vista 系统中,虚拟内存的分配可以根据需要动态变化。主要针对换页内存池、非换页内存池和会话内存池。
2 )、 SuperFetch :对应 XP 中的 Prefetcher Prefetcher 在进程启动时候针对单个进程来预取数据。例如启动 Word 这样比较大的程序时,如果不使用 Prefetcher 预先处理进程 WINWORD.EXE 启动效率会非常低, Prefetcher 可以对每个程序预留内存页面以提高进程启动的速度。在 Vista 中, SuperTetch 能够根据更加复杂的模式来预取数据,例如可以跨越多个应用程序。
3 )、 ReadyBoost :支持用 Flash (闪存)来缓存,介于 RAM 和硬盘之间,数据可以被压缩和加密。如果是顺序访问, Flash 的速度不如硬盘。但对于缓存的访问常是随机的, Flash 的性能优于硬盘。

4、  ReadyBoot 引导和停机
1 )、使用引导配置数据库替代了 Boot.ini ,存储在注册表中              
HKEY_LOCAL_MACHINE\BCD00000000.
2 )、使用两个引导程序替代了 Ntldr(NT Loader) ,分别是 Windows Boot Manager(\Bootmgr) OS loader(\Systemroot\System32\Winload.exe)
3 )、启动过程和会话管理方面的改进:对于系统会话和控制台用户会话进行隔离,使用不同的会话。
4 )、停机过程的改进:服务可以请求停机等待,也可以指定服务的停机顺序。

 

5、  可靠性和系统恢复
1 )、内核事务管理器( KTM ):用于协调应用程序和资源管理器(包括注册表和 NTFS 文件系统)
2 )、卷影拷贝( Volume Shadow Copy
XP 中已经引入,主要用于备份工具
Server 2003 中用于共享文件夹的影像拷贝,作版本的管理。
Vista 中,卷影拷贝服务可以用于系统恢复( System Restore ),更加灵活。
3 )、 Windows 错误报告( Windows Error Reporting ):之前,未处理的异常是在异常线程环境中执行的,可能会因为该异常线程本身导致发不出错误报告。 Vista 中,线程发送一个消息,由 WER 服务处理。

 

6、  安全性
1 )、 BitLocker 驱动器加密:对整个 OS 卷进行加密(要求有 1.5G 为加密的系统卷)
2 )、代码完整性检验( Code Integrity Verification ):对 OS Loader 和内核执行代码签名的检查。
3 )、地址空间布局随机化( Address Space Load Randomization ASLR ):子系统 DLL 在用户进程的地址空间不再是固定的地址位置,用户栈的位置是随机的,减少了缓冲区溢出***。
4 )、 Windows 服务的安全增强:使用“最小特权原则( the principle of least-privilege )”。
5 )、 UAC (用户帐户控制, User Account Control ):管理员组成员在运行程序时并不是特权用户,而是使用标准用户权限。当需要安装程序或访问系统数据时,系统会对操作进行提示。