读下Windows内核原理与实现 查缺补漏下 偏向理论知识
系统线程和系统进程
Windows内核除了接受来自应用程序的系统服务调用,它自己也有一些线程用于各种用途,这些线程运行在一个特殊的进程环境中,称为System进程,而System进程的线程被称为系统线程。
设备驱动程序或执行体可以在调用者进程中创建线程,也可以在System进程中创建线程,或者调用执行体函数ExQueueWorkItem或I/O管理器函数IoQueueWorkItem,向系统辅助函数请求得到它们的服务。这两个函数负责把一个工作项目放到一个队列中,而系统辅助线程将从此队列中提取工作项目,并执行工作项目中指定的一个例程。
系统辅助线程实际上是一个线程池,Windows在系统初始化时创建了一定数量的辅助线程,而且,随着辅助线程的负载的变化,执行体也会动态的创建一些辅助线程,以曼珠系统负载的变化需求。
除了系统辅助线程,内核中许多组件也会创建系统线程来完成一些必要的工作,例如,内存管理器需要后台系统线程来监视和管理内存页的换入换出。另外,设备驱动程序也可以通过调用PsCreateSystemThread函数来创建系统线程,来完成一些并非依附与调用者进程空间的任务。例如网络驱动程序和文件系统驱动可以通过系统线程来完成一些后台处理。通过PsCreateSystemThread函数创建系统线程时也可以指定其他进程作为系统线程的宿主进程,从而能够访问该进程地址空间中的数据。
Windows子系统
Windows平台上,可执行映像文件的格式为PE文件格式,其头部域Subsystem制定了该应用程序将被运行在哪个环境子系统中。例如,该域为2说明这是一个Windows GUI应用程序,为3则是Windows控制台应用程序。
Windows子系统中既有用户模式部分,也有内核模式部分。内核模式部分的核心是win32k.sys,它形式是一个驱动程序,但是它不处理I/O请求,相反,它向用户代码提供了大量的系统服务。从功能上讲,它包含两部分:窗口管理和图形设备接口GDI,其中窗口管理部分负责收集和分发消息,以及控制窗口显示和管理屏幕输出;图形设备接口部分包含各种形状绘制以及文本输出功能。
用户部分包括了Windows子系统进程csrss.exe以及一组动态链接库。Csrss.exe进程主要负责控制台窗口的功能,以及创建或删除进程和线程等。子系统DLL则被直接链接到应用程序进程中,包括kernel32.dll,user32.dll等,负责实现已文档化的Windows API函数,除了有些可以直接在用户模式中完成意外,很多API函数需要调用执行体API或win32k.sys模块提供的系统服务。
Win32k.sys一方面向用户代码提供系统服务,一方面也跟Windows内核紧密地融合在一起,它通过向内核注册一组出调函数,以便介入到内核的线程和进程的管理等处理逻辑中,同时也可以接收电源事件。对于每个线程,一旦它调用了win32k.sys的任何一个系统服务,就变成了一个GUI线程,从而纳入到了Windows子系统的线程和进程管理范畴。
Windows系统进程
csrss.exe 子系统进程
Idle 系统空闲进程
System进程 包含了内核模式系统线程
smss.exe 会话管理器 Windows系统中第一个创建的用户模式进程,创建环境变量等,启动了子系统进程csrss.exe和登录进程winlogon.exe,另外也负责创建新的终端服务器会话
winlogon.exe 登录进程,负责处理交互用户的登录和注销,当用户按下Ctrl+Alt+Del组合键时,winlogon就会接到登录请求,然后激发安全认证的过程,并启动用户会话中的初始进程,当用户会话任何时候当用户按下了组合键,winlogon都会提示一个安全对话框,其中包含了注销,关机,锁定计算机等选项
csrss.exe 子系统进程 Windows子系统进程负责为用户提供一个子系统环境,包括提供控制台窗口功能,以及创建或删除进程和线程
lsass.exe 本地安全权威子系统进程,负责本地系统安全策略,如允许哪些用户登录到本地系统中,口令策略,授予特权以及系统安全审计设置,同时也负责认证用户的身份,以及将安全审计消息发送到系统的事件日志
explorer.exe Shell进程,这是Windows默认的Shell,它提供了系统与用户打交道的各种界面,包括开始菜单,任务栏。资源管理器窗口等几乎所用Windows用户都熟悉的界面
services.exe 服务控制管理器,负责Windows的系统服务,这些系统服务指的是一些特殊的进程,它们通常不与登录用户进行交互,因此被配置成可以在系统引导时自动启动起来,无须交互登录过程