Windows系统概述

操作系统模型

操作系统内核代码运行在处理器的特权模式下(内核模式)
应用程序代码运行在处理器的非特权模式下(用户模式)
用户模式的线程在一个受保护的进程地址空间中执行(内核模式执行时,可访问系统空间)
用户模式进程的分类:

  • 系统支持进程
  • 服务进程
  • 用户应用程序
  • 环境子系统服务进程
    在windows下,用户应用程序并不直接调用原生的Windows操作系统服务,而是通过一个或多个子系统动态链接库(DLL)
    Windows内核模式组件:
  • Windows执行体:内存管理,进程,线程管理,安全性,I/O,网路和跨进程通信
  • Windows内核:线程调度,中断和异常分发,多处理器同步
  • 设备驱动程序:硬件设备驱动程序和非硬件驱动设备程序
  • 硬件抽象层:将系统与硬件差异隔离
  • 窗口和图形:实现图形用户界面
    | 文件名称 | 组件 |
    | :————————————–: | :—————————: |
    | Ntosktnl.exe | 执行体和内核 |
    | Hal.dll | 硬件抽象层 |
    | Win32k.sys | Windows子系统的内核模式部分 |
    | Ntdll.dll | 支持内部函数,以及执行体函数的系统服务分发存根(stud) |
    | Ntkrnlpa.exe(仅用于32位) | 执行体和内核,支持物理地址扩展,以及将内存标记为不可执行 |
    | Kernel32.dll,Advapi32.dll,User.dll,Gdi32.dll | Windows的核心子系统DLL |

对称多处理

多任务是指让多个执行线程共享一个处理器的操作系统技术
Windows是一个对称对处理器操作系统
没有主处理器——操作系统和用户线程可以被调度到任何处理器上运行,所有处理器共享唯一的内存空间
非对称处理器——系统只选择一个处理器来执行内核代码,其他处理器只运行用户代码
超线程:在每个物理核上提供多个逻辑处理器,每个处理器都有自己的CPU状态,但是执行缓存和片上缓存是共享的
根据线程用到的内存所在的节点,将线程调度到同一节点中的处理器上,系统尽可能在节点内部满足内存申请的请求,只有必要时才从其他的节点分配内存

可伸缩性

Windows操作系统特性:

  • 能够在任何空可用的处理器上运行操作系统代码,也可以同时在多个处理器上运行操作系统代码
  • 在单个进程内执行多个线程,每个线程可以在不同的处理器上并发执行
  • 内核内部的细粒度同步
  • 诸如I/O完成端口的编程机制,使得可以实现高效的多线程服务器进城

环境子系统和子系统DLL

将基本的Windows执行体系统服务的某个子集暴露给应用程序,每个子系统都提供了对于Windows原生服务的一个不同子集的访问能力
每个可执行映像都被绑定到一个子系统上,映像文件运行时,负责创建进程的代码会检查该映像头部的子系统类型代码,然后通知对应的子系统有新进程被创建
用户应用程序并不直接调用Windows的系统服务,而是通过一个或多个子系统DLL来进行

Windows子系统

Windows子系统进程并标记为关键进程(一旦出于某种原因退出,系统就会崩溃)
Windows子系统主要i组件:

  • 对于每个会话,环境子系统进程(Csrss.exe)有一个实例加载三个DLL(Basesrv.dll,Winsrv.dll,Csrsrv.dll),包含下列支持:
    1. 建或删除进程和线程
    2. 16位DOS虚拟机(DM)进程的部分支持(仅32位Windows)
    3. xS(Side-by-side)/Fusion和清单文件(manifext)支持
    4. 其他函数
  • 内核模式驱动程序(Win32k.sys)包含下列支持:
    1. 窗口管理器,控制窗口显示,管理屏幕输出,采集来自键盘鼠标和其他设备的输入,同时将用户消息传递给应用程序
    2. 图形设备接口
    3. Direct功能的包装函数
  • 控制台宿主进程(Conhost.exe),提供了对控制台(字符环境)应用程序的支持
  • 子系统DLL(如Kernel32.dll,Advapi32.dll,User32.dll和Gdi32.dll)将以文档化的Windows API函数转译成Ntoskrnl.exe和Win32k.sys中恰当的且绝大多数未文档化的内核模式系统服务调用
  • 图形设备驱动程序,与硬件相关的图像显示器驱动程序,打印机驱动程序和视频微端口驱动程序
    子系统的大部分运行在内核模式下,所以只有少数一些Windows函数要向Windows子系统进程发送消息:进程和线程的创建和终止,网络驱动器号,临时文件的创建

控制台窗口宿主进程

Windows为系统中的每个控制台窗口使用了一个单独的进程:控制台窗口宿主进程
多个控制台应用程序可以共享同一个控制台窗口

Ntdll.dll

内核

内核是由Ntoskrnl.exe中的一组函数以及对于硬件体系架构的低层支持(比如中断和异常分发)构成的

内核对象

帮助内核控制好中心处理过程,并且支持执行体对象的创建工作
几乎所有的策略决定都由执行体决定,线程的调度和分发由内核实现

  • 控制对象:建立有关控制各种操作系统功能的语义
  • 分发器对象:该对象融合了同步的能力,可以改变或者影响线程的调度

内核处理器控制区和控制块

内核使用处理器控制区的数据来存放与处理器有关的数据,KPCR包含了处理器的中断分发表(IDT),任务状态段(TSS)和全局描述符表(DGT)
KPCR也包含一个内核处理器控制块(KPRCB)的内嵌数据结构
KPRCB是一个私有的数据结构,仅仅Ntoskrnl.exe中的内核代码使用该结构

硬件支持

内核的另一个主要任务是将执行体和设备驱动程序从Windows所支持的各种硬件体系架构的差异中抽象或隔离出来

硬件抽象层

使得Windows操作系统能够移植到不同的硬件平台上
HAL是一个可加载的内核模式模块(Hal.dll),隐藏硬件相关的细节,提供低层接口

驱动设备程序

驱动设备程序是可加载的内核模式模块(.sys),用于在I/O管理和相应的硬件之间建立联系
在内核模式运行的三种执行环境:

在发起I/O功能的用户线程的环境中
内核模式系统线程的环境中
作为中断的结果
驱动设备程序通过调用HAL函数维护硬件

系统进程

每一个Windows系统中都会有以下进程出现:

Idle(占用空闲的CPU时间)
System进程(包含大多数内核模式进程)
会话管理器
本地会话管理器
Windows子系统
会话0初始化
登陆进程
服务控制管理器和其创建的子进程
本地安全认证服务器

System进程和系统进程

System进程是某种特殊线程的母体,这种特殊线程运行在内核模式下,称为内核模式线程
系统线程哦那个过调用PsCreateSystemThread函数创建(该函数仅能从内核模式调用)
设备驱动程序可以在任何一个进程中创建系统进程

会话管理器

会话管理器(Smss.exe)是系统中创建的第一个用户模式进程,该进程由负责完成执行体和内核初始化工作最后阶段的内核模式系统线程创建
主Smss执行以下一次性初始化步骤:

  • 将该进程和初始线程标记为关键的(如果一个标记为关键的进程或线程退出,Windows会崩溃)
  • 将进程的基本优先级提升到11
  • 新的热处理器加入进来时,新的会话将可以利用这些新加入的热处理器(如果系统支持动态增加热处理器)
  • 创建相应的名,名管道和邮件槽
  • 创建ALPC端口接收命令
  • 根据特定文件定义,创建系统范围的环境变量
  • 根据特定文件定义,在对象管理器名称空间的特定目录下为特定注册表键中定义的设备符号创建链接
  • 在对象管理器名称空间中创建\Sessions根目录
  • 运行特定位置的程序(默认是Autochk.exe 执行磁盘检查)
  • 根据指定信息,处理尚未完成的文件改名操作
  • 初始化页面文件
  • 初始化注册表其余的部分
  • 运行特定文件夹中的程序
  • 打开已知DLL,将他们映射为永久内存区(映射文件)
  • 创建一个线程来响应会话创建请求
  • 创建Smss来初始化会话0(非交互绘画)
  • 创建Smss来初始化会话1(交互会话)

    会话启动的Smss实例完成以下事项:

  • 调用NiSetSystemInformation,请求建立内核模式的会话数据结构
  • 为该会话创建子系统进程
  • 创建Winlogon实例或者Wininit实例
    之后Smss进程退出

Windows初始化进程(Wininit.exe)

  • 将自己标记为关键的
  • 初始化用户模式调度设施
  • 创建特定文件夹
  • 创建一个窗口站(Winsta0)和两个桌面(Winlogon和Default),以便会话0中的进程可以在其中运行
  • 创建Servicess.exe
  • 启动Lsass.exe
  • 启动Lsm.exe
  • 一直等待,直至系统停机

系统控制管理器(SCM)

服务有三种名称:

  1. 在系统中看到的正在运行的进程名称
  2. 注册表中的内部名称
  3. 在“服务”管理工具中给出的显示名称

本地会话管理器

管理本地机器上的终端服务器会话的状态
对于以下事件,它接收Winlogon的通知:

  1. 登陆(Logon)和注销(Logoff)
  2. Shell启动和终止
  3. 连接到一个会话
  4. 与一个会话断开连接
  5. 锁住或解锁桌面

Winlogon,LogonUI和Userinit

Windows登陆进程处理交互式用户的登陆和注销
登陆过程中的身份识别是通过一种称为凭证提供者的DLL来实现的
Winlogon是系统依赖的一个关键系统进程,凭证提供者和显示登陆对话框的UI都运行在Winlogon的一个子进程中,称为LogonUI