1第
章
Windows 2000/XP
操作系统概述
第
章1
下载
Windows 2000/XP
操作系统概述
作为全书的开篇,本章简要介绍Windows 2000/XP操作系统的体系结构、处理器管理、内存管理、
文件管理以及I / O管理的实现机制。如果读者没有读过《Wi n d o w s操作系统原理》一书,那么通过本
章可以尽快地了解Windows 2000/XP操作系统的概貌,为完成本书后续章节的实习打下必要的基础。
1.1 Windows 2000/XP的体系结构
Windows 2000/XP像其他许多操作系统一样,通过硬件机制实现了核心态(管态, k e r n e l
m o d e)和用户态(目态, user mode)两个特权级别,操作系统中那些至关紧要的代码在核心态
运行,可以访问系统数据和硬件,而用户程序在用户态运行,不能直接访问操作系统特权代码和
数据。这样就使所有操作系统组件都受到了保护,以免被错误的应用程序侵扰,这种保护使得
Windows 2000/XP成为相当稳定的工作平台。
Windows 2000/XP体系结构框图如图 1 - 1所示。下面依次介绍构成 Windows 2000/XP的各个组
成部分体系结构的细节。
系统支持进程
服务进程
应用程序
环境子系统
子系统动态链接库
用户态
核心态
执行体
内 核
设备驱动程序
硬件抽象层
图形引擎
图1-1 Windows 2000/XP体系结构框图
2
下载
1.1.1 核心态操作系统组件
第1章第Windows 2000/XP 操作系统概述
在Windows 2000/XP中,只有那些对性能影响很大的操作系统组件才在核心态下运行。在核
心态下,操作系统组件可以和硬件交互,组件之间也可以交互,并且不会引起上下文切换和模式
转变。
可移植性是 Windows 2000/XP的一个重要设计目标,即不仅可以在 X 8 6体系结构下运行,而
且可以在其他硬件平台上运行。为实现这一目标, Windows 2000/XP的核心态操作系统组件采用
了分层的结构,将依赖于处理器体系结构或平台的系统底层部分隔离在单独的模块之中,这样系
统的高层(执行体, e x e c u t i v e)就可以被屏蔽在千差万别的硬件平台之外。提供操作系统可移植
性的两个关键组件是硬件抽象层( hardware abstract layer,H A L)和内核(k e r n e l)。依赖于处理
器体系结构的功能(如线程上下文切换)在内核中实现,在相同体系结构中,因计算机硬件平台
而异的功能在H A L中实现。
1. 硬件抽象层
硬件抽象层是一个可加载的核心态模块 H A L . D L L,它为运行Windows 2000/XP的硬件平台提
供低层接口,将操作系统从与平台相关的硬件差异中隔离出来。 H A L使得每台机器的系统总线、
D M A控制器、中断控制器、系统计时器以及多处理器通信机制等对内核来说看上去都是相同的。
2. 内核
内核是n t o s k r n l . e x e的下层,它实现最基本的操作系统功能,管理线程调度、进程切换、异常
和中断处理以及多处理器同步。中断处理、异常调度和多处理器同步等功能是随处理器体系结构
的不同而异的,内核的一个重要功能就是把执行体和处理器体系结构的差异隔离开,为执行体提
供一组在整个体系结构上可移植的、语义完全相同的接口。
内核是常驻内存的,永远不会由页面调度程序调出内存。与执行体的其他部分和用户应用程
序不同,内核自身的代码并不以线程的方式运行。内核可以被中断服务例程( interrupt service
r o u t i n e,I S R)中断,但是永远不会被抢先。
内核除了实现最基本的操作系统功能外,几乎将所有的策略制定留给了执行体。这一点充分
体现了Windows 2000/XP将策略与机制分离的设计思想。
3. 执行体
Windows 2000/XP的执行体是n t o s k r n l . e x e的上层,它由一些重要的系统组件组成,这些组件
为用户态的应用程序提供了系统服务功能(即通常所说的本机 A P I)。下面简要描述了主要的执
行体组件:
• 对象管理器:负责创建、跟踪以及删除 Windows 2000/XP执行体对象。为对象的命名、维
护和安全性设置实施统一的规则。
• 进程与线程管理器:负责创建、跟踪以及删除进程和线程对象。对进程和线程的基本支持
在内核中实现,而执行体的进程与线程管理器给这些低级对象添加附加语义和功能。
• I / O管理器:为应用程序提供访问 I / O设备的统一框架,负责分发适当的设备驱动程序。
• 安全访问监视器:为访问受保护对象实施访问确认和审核,受保护对象包括文件、进程、
3
Windows 内核实验教程
I / O设备等。
下载
• 本地过程调用( local pro c e d u re call,L P C)机制 :以类似于分布式处理中远程过程调用
(RPC, Remote Procedure Call)的方式在单机系统中在应用程序和环境子系统之间实现客户
/服务器模型。
• 虚拟内存管理器:负责把进程地址空间中的虚拟地址映射为计算机内存中的物理页面。
• 高速缓存管理器:通过使最近访问过的磁盘数据驻留在内存中来提供快速访问,从而提高
基于文件的 I / O性能。
1.1.2 用户进程
图1 - 1中粗线上部的方框代表了用户进程,它们运行在私有地址空间中。 Windows 2000/XP支
持四种基本的用户进程,它们是系统支持进程、服务进程、环境子系统和应用程序,下面对它们
进行依次介绍。
1. 系统支持进程
系统支持进程是未作为操作系统核心的一部分提供的系统支持服务,例如,登录进程
(W I N L O G O N)和会话管理器( S M S S)。
2. 服务进程
Windows 2000/XP的服务进程类似于 UNIX 的守护进程,在客户端 /服务器应用程序中扮演服
务器角色。 Web 服务器就是一个服务进程的例子。
3. 环境子系统
环境子系统向应用程序提供运行环境和应用程序编程接口( Application Programming
I n t e r f a c e,A P I)。Windows 2000/XP支持三种环境子系统: Wi n 3 2、P O S I X和O S / 2。Wi n d o w s
2 0 0 0 / X P最重要的环境子系统是 Wi n 3 2子系统,其他子系统都要通过 Wi n 3 2子系统接收用户的输入
和显示输出。
环境子系统的作用是将基本的执行体系统服务的某些子集提供给应用程序。用户应用程序不
能直接调用Windows 2000/XP系统服务,这种调用必须通过一个或多个子系统动态链接库作为中
介才可以完成。例如, Wi n 3 2子系统动态链接库(包括 k e r n e l 3 2 . d l l、u s e r 3 2 . d l l和g d 1 3 2 . d l l)实现
Win32 API函数。
当一个应用程序调用子系统动态链接库中的函数时,会出现下面三种情况之一:
• 函数完全在子系统动态链接库的用户态部分中实现,这时并没有消息发送到环境子系统进
程,也没有调用执行体服务。函数在用户态中执行,结果返回到调用者。
• 函数需要一个或多个对执行体系统服务的调用。
• 函数要求某些工作在环境子系统进程中进行。在这种情况下,将产生一个客户 /服务器请求
到环境子系统,其中的一个消息将被发送到子系统去执行某些操作,这可能会使用执行体的
本地过程调用(L P C)机制。子系统动态链接库在消息返回给调用者之前会一直等待应答。
4. 应用程序
Windows 2000/XP支持五种类型的应用程序:Win32、Windows 3.1、MS-DOS、POSIX 和OS/2。
4
下载
1.1.3 Windows 2000/XP的对象模型
第1章第Windows 2000/XP 操作系统概述
Windows 2000/XP大量采用了面向对象的概念,简化了进程间资源和数据的共享,便于保护
资源免受未经许可的访问。
并非 Windows 2000/XP中的所有实体都是对象。当数据或资源对用户态开放时,或者当数
据访问是共享的或受限制时,才使用对象。采用对象方法表示的实体有文件、进程、线程、信
号量、互斥量、事件、计时器等。 Windows 2000/XP通过对象管理器以一致的方法创建和管理
所有的对象类型,对象管理器代表应用程序负责创建和删除对象,并负责授权访问对象的数据
和服务。
Windows 2000/XP中有两种类型的对象:执行体对象和内核对象。执行体对象是由执行体的
各种组件(如进程管理器、内存管理器、 I / O管理器等)实现的对象;内核对象是由内核实现的
一个更原始的对象集合,内核对象对用户态代码是不可见的,它们仅在执行体内创建和使用。内
核对象提供了一些基本性能,许多执行体对象内包含着一个或多个内核对象。
每一个对象都有一个对象头和一个对象体。对象管理器控制对象头,各执行体组件控制它们
自己创建的对象类型的对象体。
执行体对象和对象服务都是基本设施,环境子系统用它们来构造自己版本的对象和资源。环
境子系统为其应用程序提供的对象集一般与执行体所提供的有些差异。 Wi n 3 2子系统使用执行体
对象导出它自己的对象集,其中的大部分直接符合执行体对象。
当进程通过名称来创建或打开一个对象时,它会收到一个代表进程访问对象的句柄。所有用
户态进程只有获得了对象句柄之后才可以使用这个对象。句柄作为系统资源的间接指针来使用,
这种不直接的方式阻止了应用程序对系统数据结构直接地随便操作。
句柄、执行体对象以及内核对象之间的关系如图 1 - 2所示。
应用程序
句柄
执行体对象
内核对象
执行体
内 核
图1-2 句柄、执行体对象与内核对象之间的关系
用户态
核心态
5
Windows 内核实验教程
1.2 Windows 2000/XP的处理器管理
下载
Windows 2000/XP的处理器管理以进程和线程的管理为核心。在 Windows 2000/XP中,进程
是系统资源分配的基本单位,而线程则是处理器调度的实体。
Windows 2000/XP的进程和线程均被作为对象实现,进程和线程对象体由进程与线程管理器
管理,对象头由对象管理器管理,进程和线程对象在内核提供的内核进程对象和线程对象的基础
上实现。
1.2.1 Windows 2000/XP中进程的实现
Windows 2000/XP 中的每个进程都由一个执行体进程块( E P R O C E S S)表示,执行体进程
块描述进程的基本信息,并指向其他与进程控制相关的数据结构。执行体进程块中的主要内容
包括:
• 线程块列表:描述属于该进程的所有线程的相关信息,以便线程调度器进行处理器资源的
分配和回收。
• 虚拟地址描述符 ( v i rtual address descriptor,VA D ):描述进程地址空间各部分属性,用于
虚拟存储管理。
• 对象句柄列表:当进程创建或打开一个对象时,就会得到一个代表该对象的句柄,用于对
象访问。对象句柄列表维护该进程正在访问的所有对象列表。
Windows 2000/XP进程结构如图1 - 3所示。
访问令牌
进程对象
VAD
VAD
VAD
虚拟地址描述符
对象句柄列表
对象
对象
线程
线程
线程
访问令牌
图1-3 Windows 2000/XP的进程结构
Windows 2000/XP支持的各环境子系统都有相应的 A P I函数实现进程控制。 Wi n 3 2子系统的进
6
下载
第1章第Windows 2000/XP 操作系统概述
程控制A P I函数主要有 C r e a t e P r o c e s s、E x i t P r o c e s s和Te r m i n a t e P r o c e s s。C r e a t e P r o c e s s用于进程创
建,而 E x i t P r o c e s s和Te r m i n a t e P r o c e s s用于进程退出。这几个 A P I函数的具体使用方法请查阅
M S D N文档。
1.2.2 Windows 2000/XP中线程的实现
在Windows 2000/XP中,处理器调度的对象是线程。线程上下文主要包括寄存器、线程环境
块、核心栈和用户栈。 Windows 2000/XP把线程状态分成七种,如图 1 - 4所示。
创建和初始化
线程对象
初始化
放入
就绪队列
备用
就绪
抢先或时
间片结束
运行
执行完成
终止
等待完成
转换
换出的内
核堆栈
等待
图1-4 Windows 2000/XP的线程状态
• 就绪状态( R e a d y ):线程已获得除处理器外的所需资源,正等待调度执行。
• 备用状态 ( S t a n d b y ):已选择好线程的执行处理器,正等待上下文切换,以进入运行状态。
系统中每个处理器上只能有一个处于备用状态的线程。
• 运行状态 ( R u n n i n g ):已完成上下文切换,线程进入运行状态。线程会一直处于运行状态,
直到被抢先、时间片用完、线程终止或进入等待状态。
• 等待状态 ( Wa i t i n g ):线程正等待某对象,以同步线程的执行。当等待事件出现时,等待结
束,并根据优先级进入运行或就绪状态。
• 转换状态 ( Tr a n s i t i o n ):转换状态与就绪状态类似,但线程的内核堆栈位于外存。当线程等
待事件出现而它的内核堆栈处于外存时,线程进入转换状态;当线程内核堆栈被调回内存
7
Windows 内核实验教程
时,线程进入就绪状态。
下载
• 终止状态 ( Te r m i n a t e d ):线程执行完就进入终止状态;如执行体有一指向线程对象的指针,
可将处于终止状态的线程对象重新初始化,并再次使用。
• 初始化状态 ( I n i t i a l i z e d ):线程创建过程中的线程状态;
Windows 2000/XP支持的各环境子系统都有相应的 A P I函数实现线程控制。 Wi n 3 2子系统的线
程控制A P I函数主要有 C r e a t e T h r e a d、E x i t T h r e a d、S u s p e n d T h r e a d和R e s u m e T h r e a d。C r e a t e T h r e a d
完成线程创建,在调用进程的地址空间上创建一个线程,以执行指定的函数,它的返回值为所创
建线程的句柄; E x i t T h r e a d用于结束当前线程; S u s p e n d T h r e a d可挂起指定的线程; R e s u m e -
T h r e a d可激活指定线程,它的对应操作是递减指定线程的挂起计数,当挂起计数减为 0时,线程
恢复执行。这几个 A P I函数的具体使用方法请查阅 M S D N文档。
1.2.3 Windows 2000/XP线程调度
在Windows 2000/XP中,基本的处理器调度对象是线程,所以也称为线程调度。 Wi n d o w s
2 0 0 0 / X P在内核中实现它的线程调度代码,这些代码分布在内核中与调度相关事件出现的位置,
并不存在一个单独的线程调度模块。
Windows 2000/XP实现了一个基于优先级的抢先式多处理器调度系统,调度系统总是运行优
先级最高的就绪线程。
Windows 2000/XP内部使用3 2个线程优先级,范围从 0到3 1,它们被分成三个部分:
• 16个实时线程优先级( 1 6~3 1)。
• 15个可变线程优先级( 1~1 5)。
• 一个系统线程优先级( 0),仅用于对系统中空闲物理页面进行清零的零页线程。
用户可通过 Win32 API来指定线程的优先级, Windows 2000/XP内核也可控制线程的优先级。
Win32 API可以在创建进程时指定其基本优先级类型,并进一步在进程内各线程创建时指定线程
的相对优先级。
当一个线程被调度进入运行状态时,它可运行一个被称为时间配额 ( q u a n t u m )的时间片。时
间配额是 Windows 2000/XP允许一个线程连续运行的最大时间长度,随后 Windows 2000/XP会中
断该线程的运行,判断是否需要降低该线程的优先级,并查找是否有其他高优先级或相同优先
级的线程等待运行。由于 Windows 2000/XP的抢先式调度特征,一个线程的一次调度执行可能并
没有用完它的时间配额。如果一个高优先级的线程进入就绪状态,当前运行的线程可能在用完
它的时间配额前就被抢先。实际上,一个线程甚至可能在被调度进入运行状态后开始运行之前
被抢先。
为了进行线程调度,内核维护了一组称为调度器数据库( dispatcher database)的数据结构。
调度器数据库负责记录各线程的状态,如哪些线程处于等待状态、处理机正在执行哪个线程等。
调度器数据结构中最主要的内容是调度器的就绪队列,该队列由一组子队列组成,每个调度优先
级有一个队列,其中包括该优先级的等待调度执行的就绪线程。
为了提高调度速度,Windows 2000/XP维护了一个称为就绪位组(ready summary)的3 2位量。
8