2.1 需求和设计目标
Windows NT的最初需求:
l 32位
l 抢先式
l 可重入
l 支持虚拟内存
l 支持多种硬件体系结构
l 支持多处理器
l 支持分布式计算
l 向后兼容
l 符合政府和业界安全性要求
l 支持UNICODE
从软件需求的角度来说,书中列出的需求属于业务需求的范畴。不知道Windows的功能需求文档有多少页、多少条。
Windows NT的设计目标:
l 可扩展性
l 可移植性
l 可靠性
l 健壮性
l 兼容性
l 性能
这些设计目标实际上也是大多数大型软件系统一致的目标。
2.2 操作系统模型
2.3 总体结构
总体结构分为用户模式和内核模式两块。
用户模式进程有四类:
l 系统支持进程:如logon进程,会话管理器,它们不属于Windows服务。
l 服务进程:运行Windows服务的进程,如任务调度器和假脱机服务。
l 用户应用程序:可以分为六种类型,包括Windows 32位、Windows 64位、Windows 3.1 16位、MS-DOS 16位、POSIX 32位或OS/2 32位。
l 环境子系统服务器进程:环境子系统是指Windows、POSIX和OS/2,主要是为了兼容其他操作系统。实际上到了Windows XP只有Windows子系统随产品一起发布。
关于子系统DLLs:书中对这部分的描述是“子系统DLL的角色是,将一个己文档化的函数转化为一些内部(未文档化的)Windows系统服务调用。”也就是说,应用程序调用的API其实是调用子系统DLL里的函数,子系统DLL再调用Native API函数,最后到达系统服务。关于Native API,第一章里曾经有所提及。
内核模式组件:
l Windows执行体:基本的操作系统服务,如内存管理、进程和线程管理、安全性、I/O、网络和跨进程通信。
l Windows内核:更低层次的系统功能,如纯种调度、中断和异常分发、多处理器同步。执行体利用这些功能实现更高层次的功能。
l 设备驱动程序:包括硬件设备驱动程序、文件系统、网络驱动程序等。
l 硬件抽象层:隔离与平台相关的硬件差异。
l 窗口和图形系统:实现了GUI函数,如窗口的处理、界面控件、绘制功能等。(Windows的GUI在内核中实现,与Linux系统有所不同。)
下表列出了Windows核心组件的文件名:
Filename |
Components |
Ntoskrnl.exe |
Executive and kernel |
Ntkrnlpa.exe (32-bit systems only) |
Executive and kernel with support for Physical Address Extension (PAE), which allows addressing of up to 64 GB of physical memory |
Hal.dll |
Hardware abstraction layer |
Win32k.sys |
Kernel-mode part of the Windows subsystem |
Ntdll.dll |
Internal support functions and system service dispatch stubs to executive functions |
Kernel32.dll, Advapi32.dll, User32.dll, Gdi32.dll |
Core Windows subsystem DLLs |
可移植性
Windows是如何实现可移植性的,即如何能够运行在不同的硬件体系结构上。实际上,Windows2000只支持x86体系结构,Windows XP和Windows Server 2003增加了三种64位处理器族的支持:Intel Intanium IA-64族、AMD x86-64族、Intel针对x86的64位扩展技术。
Windows通过以下两种方法实现可移植性:
l 分层设计,低层部分负责隔离硬件相关的差异,具体为内核(包含在Ntoskrnl.exe中)和硬件抽象层(HAL,包含在Hal.dll中)。
l Windows绝大部分代码是用C语言编写,少部分是用C++编写。只有极少数代码是用汇编语言。(什么意思?似乎是想说C语言支持可移植性,因此Windows也支持可移植性。)
对称多处理
l Windows是支持对称多处理的操作系统。
l 对称多处理(SMP):操作系统和用户线程可以被调度到任何一个处理器上运行。
l 非对称多处理(ASMP):操作系统选择一个处理器来执行操作系统内核代码,其他的处理器只运行用户代码。
l 由于性能的原因,内核和HAL有多处理器版本和单处理器版本。在安装Windows时,会从安装介质上拷贝相应版本的文件到系统盘。
l /Windows/Repair/Setup.log中记录了安装过程中哪些文件被拷贝到系统盘。
实验:检查正在运行的ntoskrnl版本
l 可以从事件查看器里查看启动日志,ID为6009的事件是启动事件。
l 可以从注册表里查看启动的是否是PAE内核:HKLM/SYSTEM/CurrentControlSet/Control/Session Management/PhysicalAddressExtension值为1。
可伸缩性
多处理器系统的一个关键问题是可伸缩性(scalability)。Windows的可伸缩性体现在以下方面:
l 能够在任何一个可用的处理器上运行操作系统代码,也可以同时在多个处理器上运行系统代码。
l 单个进程内的多个线程可以在不同的处理器上并行执行。
l 内核内部的细粒度同步。
l 诸如I/O完成端口之类的机制,有助于实现高效的多线程服务器。
Windows版本:
Windows 2000客户版本:
Windows 2000 Professional
Windows 2000服务器版本:
Windows 2000 Server
Windows 2000 Advanced Server
Windows 2000 Datacenter Server
Windows XP 版本:
Home Edition
Professional
Starter Edition
Tablet PC Edition
Media Center Edition
Embedded Edition
Windows Server 2003版本:
Windows Server 2003 Web Edition
Standard Edition
Small Business Server
Storage Server
Enterprise Edition
Datacenter Edition
客户和服务器版本之间的差异
l 支持的处理器数目不同
l 支持的处理内存不同
l 支持的并行网络连接数量不同
l 服务器版本支持分层服务
查询版本信息
l 在注册表里可以查询当前系统类型:HKLM/SYSTEM/CurrentControlSet/Control/ProductOptions键下的ProductType和ProductSuite两个值。
l 应用程序可以调用VerifyVersionInfo函数。
l 设备驱动程序可以调用RtGetVersion函数。
客户和服务器版本之间的运行时差异:
默认配置下,服务器对系统吞吐量做了优化,客户版本针对交互式响应做了优化。系统启动时决定的几项资源分配策略也不同,如操作系统堆或池的大小、内部系统辅助线程数量、高速缓存的大小。系统运行时的策略如内存管理、线程调度等也有所不同。
检查版本
Windows的检查版本,或称调试版本,是在编译时定义了DBG标志,用于调试和跟踪的条件代码被包含进来,并且代码优化也没有执行。因此,检查版本有利于驱动开发人员调试或系统管理人员跟踪系统信息。
注:检查版本没有提供内核映像(Ntoskrnl.exe)的单处理器版本。