2.4 关键的系统组件
这一节将会深入介绍Windows内部结构和每个关键的系统组件所扮演的角色。下图是Windows核心组件更详细的图,它是2.1节的结构图细化版本。
环境子系统和子系统DLL
Windows最初有三个子系统:OS/2、POSIX和Windows。但是到了Windows XP以后,只有Windows子系统随系统一起发布。实际上Windows子系统已经成了Windows必不可少的组件,而其他两个子系统被配置成按需启动。
HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/SubSystems下面保存了子系统启动信息。其下的Required键值为必选子系统,被设置成Windows。其下的Optional键值为按需启动子系统,可以是Os2和Posix中的一个或全部。
环境子系统的角色是将Windows基本服务(Native API)的部分子集暴露给应用程序。
每一个可执行的映像(.exe)被绑定到唯一一个子系统上。映像文件的头部有子系统类型信息。Visual C++的链接器的/SUBSYSTEM选项可以指定此信息。已经链接好的映像,可以使用exetype工具来查看这个信息。
Windows子系统
组成部分:
l 环境子系统进程(csrss.exe),包含以下支持:
² 控制台(文本)窗口
² 创建或删除进程和线程
² 对16位虚拟DOS机的支持
² 其他一些函数,如GetTempFile、ExitWindowsEx等。
l 内核模式设备驱动程序(win32k.sys),包含:
² 窗口管理器(窗口显示,屏幕输出,键盘、鼠标的输入等)
² 图形设备接口(GDI)
l 子系统DLL(Kernel32.dll、Advapi32.dll、User32.dll、Gdi32.dll)
l 图形设备驱动程序
POSIX子系统
POSIX: Portable Operating System Interface based on Unix
l Windows只实现了众多POSIX标准中的一个,即POSIX.1。这个标准只提供了对POSIX应用程序极其有限的支持。
l Microsoft提供一个称为“Windows Services for Unix”的产品,提供了一个增加的POSIX支持环境。
l 在Windows中编译和链接一个POSIX应用程序,应该使用Platform SDK中的POSIX头文件和库文件(psxdll.dll)。
l POSIX子系统默认配置成按需启动。当第一次启动POSIX程序时,POSIX子系统进程(psxss.exe)会被启动。
实验
书中提供了一个实验可以观察POSIX子系统的启动。只需要运行一个POSIX程序,如“Windows Services for Unix”中带的C Shell,即可用进程管理器观察到POSIX子系统进程psxss.exe被启动起来。但从我的实际操作结果来看,安装了Windows Services for Unix 3.5以后,每次操作系统启动后,psxss.exe进程就已经启动,似乎不太符合书中所说的按需启动。
安装Windows Services for Unix 3.5以后,系统中多了以下进程:
init进程(linux下耳熟能详的名字)
initd进程(同上)
psxss.exe(POSIX子系统进程)
psxrun.exe(不知为何物)
zzinterix(不知为何物)
tcsh(C Shell进程,同样是linux下耳熟能详的名字)
OS/2子系统
OS/2子系统在可用性方面比POSIX子系统更逊一筹,略去。
Ntdll.dll
Ntdll包含两类函数:
l 系统服务分发存根。这类函数以Nt开头,就是所谓的Native API,通过调用它们可切换到内核模式下,从而调用系统服务。
l 内部支持函数。在ntdll.dll中具体实现的函数,以Ldr开头的是映像加载器,Csr开头的是子系统进程通信函数,以Rtl开头的是运行库函数。
执行体
Windows执行体是Ntoskrnl.exe中的上层(内核是其下层),包含以下组件:
l 配置管理器
l 进程和线程管理器
l 安全引用监视器
l I/O管理器
l 即插即用管理器
l 电源管理器
l WDM Windows管理规范例程
l 高速缓存管理器
l 内在管理器
l 逻辑预取器
l 对象管理器
l LPC设施
l 公共运行库
l 执行体支持例程
内核
内核是由Ntoskrnl.exe中的一组函数和硬件低层支持(如中断和异常分发)构成,提供了一些基本的机制,如线程调度和同步服务。内核中的许多函数以Ke开头。在DDK中有详细描述。当然,如果下载了Windows Research Kernel,就可以直接看这些函数的实现细节。