操作系统分析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 WRK

WRK是基于Windows Server 2003内核的简化版本,它没有单纯地使用某一种体系结构,而是融合了分层操作系统和客户/服务器(微内核)操作系统的特点。像其他许多操作系统一样,Windows通过硬件机制实现了核心态(管态,kernel mode)及用户态(目态,user mode)两个特权级别。WRK的代码为核心态,CPU处于特权模式,可以执行任何指令,并且可以改变状态。而在用户态下,CPU处于非特权(较低特权级)模式,只能执行非特权指令。一般来说,操作系统中那些至关紧要的代码都运行在核心态,而用户程序一般运行在用户态。当用户程序使用了特权指令,操作系统能就借助于硬件提供的保护机制剥夺用户程序的控制权并进行相应处理。

在WRK中,只有那些对性能影响很大的操作系统组件才在核心态下运行。在核心态下,组件可以和硬件交互,组件之间也可以交互,并且不会引起描述表切换和模式转变。例如,内存管理器、高速缓存管理器、对象及安全管理器、网络协议、文件系统(包括网络服务器和重定向程序)及所有的线程和进程管理,都运行在核心态。

WRK的核心态组件使用了面向对象设计原则,例如,它们不能直接访问某个数据结构中由单独组件维护的消息,这些组件只能使用外部的接口传送参数并访问或修改这些数据。但是,WRK并不是一个严格的面向对象系统,它的大部分代码不是用面向对象语言写成的,它使用C语言并采用了基于C语言的对象实现。

Windows 2000/XP系统的体系结构如图1-3所示。图中粗线将Windows分为用户态和核心态两部分。粗线上部的方框代表了用户进程,它们运行在私有地址空间中。用户进程有4种基本类型:(1)系统支持进程(system support process);(2)服务进程(service process);(3)环境子系统(enviroment subsystem):Win32、POSIX和OS/2 1.2;(4)用户应用程序(user application),是Win32、Windows 3.1、MS-DOS、POSIX或OS/2 1.2这5种类型之一。从图1-3中可以看出,服务进程和用户程序不能直接调用操作系统服务,它们必须通过子系统动态链接库(subsystem DLL)进行调用。动态链接库这部分代码并没有公开。

图1-3 Windows 2000/XP体系结构框图

粗线以下是Windows的核心部分:执行体、核心、设备驱动程序和硬件抽象层。WRK包含了前两个部分的代码,不包含各种第三方的驱动程序和硬件抽象层(HAL)代码。

(1)核心(kernel)

核心包含了最低级的操作系统功能,主要包括:(1)线程安排和调度;(2)陷阱处理和异常调度;(3)中断处理和调度;(4)多处理器同步;(5)供执行体使用的基本内核对象(在某些情况下可以导出到用户态)。同时也提供了执行体(Executive)用来实现高级结构的一组例程和基本对象。

核心的另外一个重要功能就是把执行体和设备驱动程序同硬件体系结构的差异隔离开,包括处理功能之间的差异,例如中断处理、异常情况调度和多处理器同步。核心支持一组在整个体系结构上可移植、语义完全相同的接口。

(2)执行体(Executive)

执行体是WRK的上层(核心是其下层),包含了基本的操作系统服务,例如内存管理器、进程和线程管理、安全控制、I/O以及进程间的通信。

执行体包含下列重要的组件:进程和线程管理器创建及中止进程和线程;虚拟内存管理器实现虚拟内存;安全引用监视器在本地计算机上执行安全策略;I/O系统执行独立于设备的输入/输出;高速缓存管理器。此外,执行体还包括4组主要的支持函数,它们由上面列出的执行体组件使用。其中大约有三分之一的支持函数在DDK中已经文档化。这4类支持函数提供对象管理、本地过程调用(Local Procedure Call,LPC)、一组广泛的公用运行时函数(例如字符串处理、算术运算、数据类型转换等)、执行体支持例程(例如系统内存分配、互锁内存访问等)。

(3)硬件抽象层(HAL)

Windows系统设计的一个至关重要的方面就是在多种硬件平台上的可移植性,HAL就是使这种可移植性成为可能的关键部分。HAL是一个可加载的核心态模块HAL.dll,它隐藏各种与硬件有关的细节。需要注意,由于WRK是Windows Server 2003的简化,因此通过WRK生成的内核只能在支持多处理器的硬件抽象层上运行。

(4)设备驱动程序(Device Drivers)

设备驱动程序包括文件系统和硬件设备驱动程序等,其中硬件设备驱动程序将用户的I/O函数调用转换为对特定硬件设备的I/O请求。设备驱动程序是可加载的核心态模块(通常以.sys为扩展名),它们是I/O系统和相关硬件之间的接口。WRK不包含这部分代码。