第二章,系统架构——需求分析和设计目标,操作系统模型,架构概览
第二章,系统架构
现在,我们已经涉及到了你需要熟悉的术语,概念和工具,做好了探索windows操作系统内部设计目标的准备。这一章阐述了系统整体的架构——关键的组件,他们之间如何相互作用,以及他们运行的场景。这为理解windows的内部构造提供一个框架。先来看看决定了系统的原始设计和规范的需求与目的。
需求分析和设计目标
早在1989,下面的需求决定了windows NT的设计规范:
- 提供一个真正的32位,抢占式,多任务多用户,虚拟内存的操作系统
- 可运行在多种硬件架构和平台上
- 可运行并扩展于对称多处理器的系统中
- 成为一个很棒的分布式处理平台,即可作为服务器又可作为客户端
- 可运行绝大多数已经存在的16位MS-DOS和windows 3.1程序
- 符合政府的POSIX 1003.1规范
- 符合政府和行业有关操作系统安全的规范
- 支持unicode以便很容易支持国际市场
在项目开始的时候,windows NT的设计团队确定了如下设计目标来总领数以千计的设计方案,满足上面的需求:
- 可扩展性 代码必须能够随着市场需求的改变而很容易地扩展和修改
- 可移植性 系统必须能运行在多种硬件架构上并能够根据市场需要,相对容易地移动到新的环境中
- 可靠性和耐用性 系统应该可以从内部故障和外部干扰中保护自己,应用程序不可以危害到操作系统本身或者其他应用程序
- 兼容性 尽管windows NT应该扩展已有技术,但用户界面和API应该兼容旧版本的windows和MS-DOS。而且它还要能和其他的操作系统协同配合,比如UNIX,OS/2还有NetWare。
- 性能 在其他设计目标的限制下,系统要在每一个硬件平台上尽可能地运行与响应迅速
随着我们深入探索windows的内部结构细节,你会发现这些原始的设计目标和市场需求被成功地融入系统。探索之前,我们再来查看下windows的整体设计模式,并与其他的现代操作系统比较下。
操作系统模型
在绝大多数多用户操作系统中,应用程序被OS隔离开——操作系统的核心代码运行在处理器特权模式下(本书简称内核模式),可以访问系统的数据并直面硬件;应用程序代码运行在处理器非特权模式下(用户模式),接口受限,访问系统数据受限,也不可以直接访问硬件。当一个用户模式程序请求系统服务,处理器执行一个特殊的指令切换调用线程到内核模式,然后系统服务完成,操作系统切换当前线程会话回到用户模式,最后允许调用者继续运行。
windows和大多数的UNIX系统类似,OS作为一个整体,系统的组件和驱动代码享有一个内核模式保护下的内存空间。这意味着任何系统组件或者设备驱动可能使用其他组件破坏的数据。所以windows也实现了一些内核保护机制,比如PatchGuard,Kernel Code Signing(在第三章 系统机制 中均有提及),来缓解和预防共享内核地址空间的问题。
所有这些操作系统的组件当然地被完全地保护起来,应用程序不可以直接访问特权级下的操作系统的代码和数据(尽管他们可以快速调用内核服务)。这项保护是windows可以健壮可靠地作为应用程序服务器和工作站的原因之一,另外还有快速灵活地核心系统服务,比如虚拟内存管理,文件I/O,网络和文件打印机共享。
windows的内核模式组件也体现在基本的面向对象设计原则。例如,一般维护组件的时候不进入到另一个组件的数据结构之中去获取信息,取而代之的是用正式的接口来传递参数访问数据结构。
尽管普遍使用对象来共享系统资源,但是windows不是一个严格意义上的面向对象系统。大部分的操作系统代码是用C写的,来保证可移植性。C语言并不直接支持面向对象结构,比如动态绑定数据类型,多态函数,或者类的继承。windows中的对象借用C实现,但并不依赖C,也不依赖面向对象语言。
架构概览
这个简短的设计目标和windows包装的概览中,来看看组成其架构的核心系统组件。一个简化版本的架构在图2-1中。记住这张图是很基础的——并没有展示所有的东西。(比如,网络组件和各个类型的硬件驱动层并没有画出来)
图2-1 精简版系统架构
在图2-1中,首先注意分开用户模式和内核模式的那条线。上面的盒子代表用户模式的进程和组件,线下面的代表内核模式的系统服务。如第一章中提到的“概念和工具”,用户模式线程运行在被保护起来的进程地址空间中。系统支持进程,服务进程,用户应用程序,环境子系统各自有他们的私有进程地址空间。
用户模式进程的4个基本类型如下:
- 固定(或者硬件)系统支持进程 例如登陆进程和会话管理 这些不是windows服务(他们不是有服务管理器开启的进程,见第四章“管理与机制”,详述了服务的细节)。
- 服务进程 提供windows服务,比如任务计划和后台打印服务。服务独立于不同用户的登陆。许多windows服务程序,比如Microsoft SQL Server和Microsoft Exchange Server也包含服务组件。
- 用户应用程序 可以是如下类型:windows32位或64位,windows3.1的16位,MS-DOS 16位,或者POSIX 32位/64位。注意16位程序只能运行在32位的windows上。
- 环境子系统服务进程 支持完成OS系统环境的一部分,呈献给用户和程序员。windowsNT原本装有3个环境子系统:windows,POSIX,OS/2。然而,POSIX和OS/2子系统最后支持到windows 2000所有的服务器版本,和旗舰版企业版的客户端版本上。包括其中一个增强的POSIX子系统,叫做SUA。
在图2-1中,注意在“Service processes”和“User applications”下面的“Subsystem DLL”。windows中,用户应用程序不可以直接调用windows本身的服务,而是通过一个或者多个DLL。子系统的DLL扮演的角色是翻译有记录的函数(通常也有无记录的),转换成内部的本地系统服务调用。这种翻译转换可能发送也可能不发送用户程序的消息到环境子系统进程。
内核模式组建包括如下:
- windows可执行的部分包括基本系统服务 比如内存管理,进程线程管理,安全,I/O,网络和进程间通信
- windows内核的底层系统函数 比如线程调度,中断,异常调度,和多处理器同步。其也提供一组例程和基本的对象供给更高级别的结构使用。
- 设备驱动 包括硬件设备驱动(转换用户I/O函数到特定的硬件设备I/O请求)和非硬件设备驱动(比如文件系统和网络驱动)
- 硬件抽象层(HAL) 从内核中分离出的一层代码,包括设备驱动,以及windows用来屏蔽不同硬件差异(比如主板)的部分。
- 窗口和图形系统 实现了图形用户界面(GUI)函数(比称作windows USER和GDI函数更好),比如窗口处理,用户界面控制和构建。
表2-1列出了windows核心组件的名字。这里每一个组件都在本章后面和后面的章节中非常详细地提及了。
表2-1 windows 核心文件
文件名 | 组件 |
Ntoskrnl.exe | |
Ntkrnlpa.exe (32-bit systems only) |
可执行程序和内核,支持物理地址扩展(PAE), 允许32位系统使用64G内存并标记内存为不可运行 (详见第二部分的第十章,”内存管理“) |
Hal.dll | 硬件抽象层 |
Win32k.sys | 内核模式部分的windows子系统 |
Ntdll.dll | 内部支持函数和系统服务调度 |
Kernel32.dll, Advapi32.dll,
User32.dll, Gdi32.dll
|
windows子系统核心DLL |
深入挖掘系统组件细节之前,检查下windows内核设计的基础,看看windows在多个硬件平台下是如何实现的可移植性。
2012年5月15日 14:09