Windows NT 内核架构研究
摘 要: 微软的NT系统关键技术是抢占式、可重入和虚拟内存操作,可以运行在多种硬件架构和平台上。它能够很好的扩展对称多处理器系统,具有健壮性、分布式和客户服务平台的特性。NT5.0是一个出色的操作系统,网络功能被加到系统的很多领域中。它不是对以前系统的重写,以前版本内核系统架构的许多方面都保持了下来。本文主要对NT内核做一个全面的介绍,主要包括内核模式和用户模式中的组件和服务。
关键词: 内核架构;虚拟内存;内核模式;用户模式
图1是Windosw NT系统架构和组件[1]。在那线上面的矩形框代表了各种用户模式的进程,在线下面的框子代表了内核模式操作系统的服务。用户模式的线程运行在受保护的进程地址空间中,当他们在内核模式中执行时,它们必须访问系统空间。因此,系统进程、服务进程、环境子进程和用户应用程序都有它们自己的私有进程地址空间。首先将介绍内核模式组件,包括:内存管理、高速缓存管理、对象和安全管理、网络协议、文件系统和所有的进程和线程管理,然后再介绍用户模式组件,包括系统进程、系统服务、应用程序和环境子系统。最后将对NT系统中常见的蓝屏问题进行分析并介绍3个解决方案。
图1 Windows NT系统架构和组件
对性能要求高的操作系统组件运行在内核模式,这样它们就可以直接跟硬件进行和其它组件进行信息交互而不会造成因语义选择和模式转化所造成的开销。例如,内存管理、高速缓存管理、对象和安全管理、网络协议、文件系统和所有的进程和线程管理都运行在内核模式。所有这些组件都被错误处理程序充分的保护,因为应用程序不会直接的访问操作系统级别的代码和数据。80386定义了4种特权级别,或者成为环,如图2.所示,其中最里面的0级是最高级,最外面的3级是最低级[2]。NT内核组件包括了一些基本的面向对象的设计原则。例如,它们不能获得其它的数据结构以访问其它私有组件维护的信息。相反,它们使用规范的接口传递参数并访问或更改数据结构。NT操作系统不是一个完全的面向对象的操作系统,因为大部分的系统代码是用C语言写的,以得到很快的速度和良好的可移植性。
图2 CPU支持的特权级别
NT执行体包括一些基本的操作系统服务,例如内存管理,进程和线程管理,安全,输入输出,进程间通信。执行体是NTOSKER.EXE的高层,内核是它的底层。它包含了如下几个主要的组件:
u 进程和线程管理器负责创建和终止进程和线程。对进程和线程提供基础支持的部分在内核部分实现,执行体对这些底层的对象添加了额外的语义和函数。
u 虚拟内存管理器实现了虚拟内存,即一个内存管理列表,为每个进程提供了一个巨大、私有的地址空间,并防止本进程的地址空间受其它进程的影响。内存管理器同时也为高速缓存提供底层的支持。
u 安全参考基准为本机提供了强制的安全策略。它指导者操作系统的资源,进行运行时对象的保护和审查。
u I/O系统实现了设备独立的输入/输出,同时负责调度适当的设备驱动以方便以后的进程调用。
u 缓存管理通过将最近引用的磁盘数据放入主存以提高基于文件输入输出性能。
另外,执行体包含了被执行体组件利用的四组支持函数,这四组函数如下所示:
u 对象管理器:负责创建、管理和删除执行体对象和代表OS进程、线程和各种异步对象资源的抽象数据类型。
u LPC便于同一台电脑上的客户进程和服务进程之间的通信。 LPC是 RPC的优化版本,是客户服务进程通过网络进行通信的工业标准。图3是UNIX通过RPC进行软件调用的规则图[3]。
u 一系列公共运行时函数,如字符处理,算术运算,数据类型转换,安全结构处理。
u 执行体支持的函数,例如系统内存分配,互锁内存访问,以及两个特殊类型的异步对象:资源和快速互斥体。
图3 软件通过RPC连接
内核执行了NT中的大部分基础操作,决定着OS是是如何使用进程并确保它们被正确的使用着。这是 NTOSKRNL.EXE的最底层。以下是内核提供的基本功能:
u 线程安排和调度。
u 软中断处理和异常调度。
u 中断处理和调度。
u 多处理器同步
u 提供倍执行体使用的基本内核对象。
内核在以下几个方面与执行体有许多不同的地方。不像执行体的其它部分,内核块是常驻内存的。尽管内核可被中断去执行中断服务,但它的执行不会被其它运行的线程所占用。内核代码主要是用C语言写的,有一些为那些需要快速的代码或依赖处理器性能的任务用汇编写来。
内核通过实现操作系统的机制和避免做策略将自己与执行体的其它部分分割开来。几乎所有的策略决定都是由执行体来做的。内核实现了一系列简单的对象集,叫做内核对象,它可以帮助内核控制中心处理并支持创建执行体对象。
内核其它主要的任务是将执行体和设备驱动与NT所支持的各种硬件结构抽象或分隔开。一些结构相关的函数(如线程语义转化)都是在内核中实现的。系统体系结构相同,但因机器多样性二造成函数不同的部分都是在HAL中实现的。
HAL是一个可加载的内核模式模块,它为NT所运行的平台提供了底层接口。它隐藏了硬件相关的细节,如输入输出接口、中断控制器、多处理器间的通信机制,同时也隐藏了跟机构相关和机器相关的函数。
NT的内部组件像和用户写的驱动需要平台相关的信息时,通过调用HAL函数来维持可移植性,而不是直接访问硬件
设备驱动是一个可加载的内核模式模块,是操作系统和相关硬件的界面。驱动一般使用C语言写的,因此,适当的使用HAL函数,对于不同的CPU架构,源代码能保持良好的可移植性。以下是一些典型的设备驱动类型:
u 硬件设备驱动直接操控硬件从其它硬件设备或网络中进行写输出或取回输入[4]。图4是NT中输入输出组件图。
u 文件系统驱动是NT的驱动,它接受面向文件的输入输出请求并转换成对应设备输入输出请求。
u 过滤驱动,执行磁盘镜像和假冒,监听输入输出,在讲输入输出传到下一层时增加一些额外值。
u 文件转向器和服务是文件系统驱动,转换通过网络远程I/O请求并接受请求,图5是一个对NTFS文件系统进行过滤的文件系统示意图[4]。
图4 NT中输入输出组件图。
图5 一个对NTFS文件系统的文件系统过滤层示意图。
用户进程有以下四个基本类型:
u 特殊系统支持进程,如非NT服务的登录进程和会话管理。
u NT服务的服务进程,如日志。许多附加的服务程序,如 Microsoft SQL Server 和Microsoft Exchange Server,同样包含运行在NT服务上的组件。
u 环境子系统,用于将本地OS服务暴露给用户应用程序以提供OS环境或个性配置。NT中有3个子系统:Win32,Posix,OS/2 1.2.
用户应用程序可以是以下5种类型之一:Win32,Windows3.1,MS-DOS,Posix,或者OS/2 1.2.
特别强调的是,由于Win32子系统的特殊性,没有这个子系统,NT将无法运行。环境子系统将一些NT的执行体的子集暴露给应用程序。 在NT系统中,用户应用程序通过环境子系统链接库而不是直接访问本地操作系统服务。
Win32子系统的主要组件式环境子系统进程和内核模式的设备驱动。环境子系统有以下四个功能:
u 控制台窗口。
u 进程和线程的创建和删除。
u 支持16位虚拟DOS机器进程的分区。
u 各种函数集:如GetTempFile, DefineDosDevice, ExitWindowsEx和一些语言支持函数。
应用程序调用标准用户函数在显示器上创建窗口和按钮。窗口管理器将一些请求传给设备驱动并将这些请求进行转换成显示设备识别的信号。GDI提供了一系列标准函数让应用程序和图形设备进行通信,包括显示器和打印机,而不需知道设备的具体信息。它也为应用程序提供了一个标准的接口以使用各种图形输出设备。这个接口使得应用程序与硬件设备和它们的驱动独立开来。
NTDLL.DLL是为了使用子系统DLL而创建的特殊系统支持库,它主要包括以下两类函数:
u 将占位程序分配给NT执行体系统服务的系统服务程序。
u 被子系统、子系统DLL和其它本地映像所使用的支持函数。
第一组函数为NT执行体系统服务提供接口,使它可以被用户模式所调用。第二组函数包含许多支持函数,如映像装载器,堆管理器,Win32子系统进程通信函数和许多运行时库函数。它也包含了用户模式的异步程序分配和异常分配。
虽然NT的流行已久很普遍了,同时也是一个通用型计算机并在实时应用程序中逐渐被使用。然而,NT不是作为一个实时操作系统来设计的,在实时环境中,NT很容易出现蓝屏死机[6]。
许多用户将NT冲突的原因归咎于操作系统。下面将介绍几个能导致冲突的因素[7]。任何对NT平台的更改都会导致它的稳定性降低。
u 硬件的更改或物理问题
u 错误的配置
u 坏内核
一些公司已经开发出NT的插件以获得实时的操作系统。由于实行系统常用来控制现实时间的物理对象,其可靠性受到很大的关注。3个实时插件提供了一个防止NT被用于硬实时环境的解决方案[8]:给进程和线程提供较少的优先权,无优先权继承机制和NT中断管理机制。这些插件的目标是挽救NT的死机。每种运行时插件处理问题的方式不同,理问题的细节也很不一样,但它们都是为了处理上面所讨论的问题。比较好的3个插件为:ImaginationSystem 的Hyperkernel,RadiSys的INtime和VenturCom的RTX。
本文从内核模式和用户模式对NT系统架构的各个组件及服务来介绍了NT内核的整个架构。NT的使用广泛,其图形用户接口十分流行,Win32 API被认为是一个标准。在NT环境下可以使用许多开发工具。NT系统不仅是一个桌面系统及商业应用,它同时也在工业控制,制造业和通信装备上也有应用。然而,在NT的文档中[9]NT是一个通用的操作系统并能提供快速的响应时间,但它却不能达到硬实时系统的要求。当NT内核停止事件发生时,NT就会蓝屏。许多公司已开发出插件来解决这个问题,如ImaginationSystem 的Hyperkernel,RadiSys的INtime和VenturCom的RTX。
References:
[1] David A.Solomon. The Windows NT KernelArchitecture.Computer,1998,31(10):40~47.