Windows操作系统——系统结构

对Windows系统结构做个总结,主要写整体结构,并不涉及各个组件的具体实现和其他细节。

总体结构

Windows可以分为用户模式和内核模式。

用户模式主要包括四个部分:系统进程、服务进程、用户应用程序和环境子系统。系统进程包括登录进程、会话管理器等;服务进程为Windows服务提供寄宿;用户应用程序是最常见的进程,通过调用环境子系统提供的子系统dll间接调用内部函数;环境子系统实现操作系统对外接口等。

内核模式包括Windows执行体、内核、驱动程序和窗口图形系统。Windows执行体包括基本操作系统服务,如内存管理、进程线程管理、IO、安全等;内核实现更底层功能,如线程调度、中断异常分发、多处理器同步等;设备驱动程序包括文件系统驱动、网络驱动、硬件驱动等,和内核是同一级;窗口图形系统实现图形用户界面,对窗口处理、用户界面控件等。

有一些系统核心组件,需要知道它们的文件名,便于进一步讨论和对系统的理解。

ntoskrnl.exe是Windows执行体和内核的实现,hal.dll是硬件抽象层,win32k.sys是Windows子系统的内核模式,ntdll.dll提供内部支持函数和系统服务分发存根;各种子系统dll如kernel32.dll、advapi32.dll、user32.dll等。

Windows通过ntoskrnl.exe和Hal.dll实现了多平台可移植,隐藏了硬件实现细节,位上层提供接口。在对称多处理器平台,如超线程和NUMA系统,Windows会选择合适的ntoskrnl.exe和Hal.dll提供给计算机。

环境子系统和子系统dll

环境子系统就是将Windows基本系统服务提供给应用层,这里的系统服务可以说是内部函数,比如通过SSDT和shadow ssdt导出的系统服务。每个子系统都将系统的一部分展示给上层,每个可执行映像都被绑定到唯一的子系统,/subsystem,绑定之后只能调用该子系统导出的部分。

Windows环境子系统相当于把Windows划分成块,可以提供不同的API。Windows提供两个子系统,POSIX和WINDOWS子系统,最开始还有OS/2子系统,后来取消了。

但是事实上,其他子系统都是通过调用Windows子系统来实现功能的,即Windows子系统是必不可少的,而posix子系统本身就是一个Windows可执行文件。

子系统dll是环境子系统提供的dll,用于应用程序调用,其实系统进程并不调用子系统dll,而是直接调用更底层的ntdll.dll中的函数,这个先不提。应用程序调用子系统dll中的某个函数时,可能发生三种情况:该函数完全由子系统dll实现,不进入内核;该函数要求Windows执行体的某个底层函数,如ReadFile要求NtReadFile;该函数要求在环境子系统中完成某些任务,涉及到Windows消息机制。

环境子系统可以分为以下部分:

1、环境子系统进程csrss.exe,这是一个用户模式进程,它用于控制台窗口控制和创建删除进程线程,同时提供一些函数,用于上面所说的第一种函数请求情况;

2、内核模式驱动程序win32k.sys,这是环境子系统的内核部分。主要包括窗口管理器和图形设备接口,可以看到Windows的图形操作是在内核实现的,所以反应比linux更灵敏;

3、子系统dll,将API翻译成Ntoskrnl.exe和win32k.sys中的未文档化函数;

4、图形设备驱动程序,如显示驱动、打印机驱动等。

环境子系统相当于一个中介,几乎所有的Windows程序都会用到Windows环境子系统,需要慢慢领悟。

ntdll.dll

系统支持库,主要用于子系统dll和原生映像。包括系统服务分发存根和内部支持函数。

系统服务分发存根的意思就是能根据用户请求的api调用相应的系统服务,ntdll包含了API的同名函数,函数内部代码实现模式切换,从而调用系统服务分发器,分发器检验参数之后调用真正的内核模式系统服务。内部支持函数包括映像加载器、对管理器、Windows子系统进程通信函数等。

这里给出一些未文档化函数的常用前缀,这些主要从ntdll.dll、ntoskrnl.exe和Hal.dll中发掘:

Cc 高速缓存管理器(Cache manager)

Cm 配置管理器(Configuration manager)

Ex 执行体支持例程(executive support routines)

FsRtl 文件系统驱动程序运行库

Hal 硬件抽象层

Io IO管理器

Ke 内核

Lpc 本地过程调用

Lsa 本地安全认证

Mm 内存管理器

Nt Windows系统服务

Ob 对象管理器

Po 电源管理器

Pp Pnp管理器

Ps 进程支持(process support)

Rtl 运行库

Se 安全性

Wmi Windows管理规范

Zw 调用Nt开头的同名函数,只用于切换模式

Ntoskrnl.exe

ntoskrnl.exe包括两个部分:执行体和内核。都是在内核模式,只不过内核相对更底层。

执行体

执行体主要实现管理控制,包括这些部分:

1、可在用户模式下调用的导出函数,成为系统服务;

2、通过DeviceIoControl调用的设备驱动器函数;

3、只能在内核模式下调用的函数,在Windows DDK中文档化;

4、可在内核模式下调用的未文档化导出函数,和各种导出、未导出的全局符号、函数等;

执行体的主要组件是各种管理器,如配置管理器,进程线程管理器,安全引用监视器,IO管理器,即插即用管理器,电源管理器,WDM,高速缓存管理器,内存管理器,逻辑预取器。可以看到执行体主要实现的是系统的管理部分,同时执行体还包括一些支持函数用于驱动程序,如对象管理器、LPC设施、公共运行库函数和执行体支持例程。

内核

内核是ntoskrnl.exe的下层,用于对硬件体系结构的底层支持,相对于执行体的管理,内核更注重调度和底层细节问题。所以会用到更多的汇编代码。

内核通过内核对象管理系统,包括控制对象和分发器对象。同时内核将执行体和驱动与硬件体系隔离开,提供接口供其调用。和硬件抽象层功能类似,但是相对硬件抽象层还要更高层一些。

硬件抽象层HAL

硬件抽象层是Windows系统实现可移植性的关键,隐藏硬件细节,如IO接口,中断控制器,多处理器通信机制等,只提供接口给上层使用。Windows会附带多个hal.dll,安装系统的时候根据硬件不同选取合适的hal.dll,与ntoskrnl.exe类似。

驱动程序

驱动程序跟内核是同一个级别,是可加载的内核模块,在IO管理器和硬件之间建立联系。可以分为硬件驱动、文件系统驱动、文件系统过滤驱动、协议驱动等。

Windows驱动程序开发模型WDM方便了NT驱动的开发,主要有以下三种:总线型、功能性和过滤性,其作用不言而喻。新型的WDF开发模型我还不太懂。

系统进程

系统进程会出现在每一个操作系统,有空闲进程,system进程,会话管理器(smss.exe),Windows子系统进程(csrss.exe),登录进程(winlogon.exe),服务控制管理器(services.exe)和本地安全认证服务器(lsass.exe)。

空闲进程是没有对应的可执行映像的,是一个虚拟进程,每个处理器有一个,中断和DPC消耗的CPU时间也会并入空闲进程。system进程为系统线程提供寄宿,也没有对应的可执行映像,它运行在内核模式;系统线程跟普通线程一样,拥有优先级,遵循同样的调度规则,区别仅在于它们运行在内核模式,没有用户进程空间。系统线程通过PsCreateSystemThread函数产生,驱动程序的DriverEntry运行在system进程。但是驱动也可以创建一个运行在某个用户进程空间的系统线程,比如win32k.sys在Windows子系统进程CSRSS.EXE中创建系统线程。

会话管理器smss.exe是系统创建的第一个用户模式进程,完成执行体和内核初始化工作之后创建了实际的smss进程。会话管理器在系统启动过程会执行一些重要操作,比如打开页面文件、延迟删除文件、创建系统环境变量,同时它会启动Windows登录进程winlogon.exe和子系统进程csrss.exe,如果这两个进程不能成功启动,那就会让系统崩溃。

既然smss.exe称为会话管理器,那么它的主要工作之一就是创建会话,关于会话、窗体、桌面,以后会详细介绍。smss通过调用NtSetSystemInformation建立内核数据结构,然后调用MmSessionCreate建立会话虚拟空间。为该会话创建winlogon和csrss进程。

winlogon登录进程接收ctrl+alt+delete组合键,作为登录请求。

登录过程的身份识别认证利用一个可替换的验证dll,msgina.dll。实际上,这个dll可以被替换,所以可以有指纹识别等登录认证方式。

lsass调用认证包对用户名和密码进行认证,如果认证通过,lsass通过安全引用监视器创建访问令牌对象,利用该令牌创建用户会话的初始进程,默认是userinit.exe。可以在注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon中查看相关项。

userinit执行用户环境初始化工作,同时启动一个shell,就是explorer.exe。

接着userinit就会退出,explorer.exe会被设置为关闭后重启,除非通过任务管理器关闭,

最后介绍服务控制管理器,services.exe,它为Windows服务提供寄宿。这里提到的服务是指一类特殊的进程,类似linux中的守护进程。

最后

具体的组件细节以后再写,深入解析Windows操作系统更好的描述了这些内容。