用户态

用户态有四类组件,这四类组件都是以进程形式存在的,也就是说,它们都有自己的进程地址空间(其实就是一套页表)。

1. System Support Processes

这些是固化的进程,也就是说是操作系统结合在一起的进程。

比如logon process(winlogon.exe),Session manager(smss.exe)。

Session Manager          [smss.exe]
Local Session Manager       [lsm.exe]
Service Control Manager     [services.exe]
Local Security Authority     [lsass.exe]
Winlogon              [winlogon.exe]
Wininit               [wininit.exe]

  

它们都不属于service,因为它们都不是由SCM(Service Control Manager)启动的。

lsass.exe和lsm.exe就是service。

2. Service Processes

Service进程是由SCM启动的,它们与user logon是独立的,因为有些service的启动时机比winlogon.exe还早。

Task Scheduler和Print Spooler都是services。

Service Host    [svchost.exe]

  

3. User Applications

就是常说的应用程序。

4. Environment Subsystem Server Processes

就是常说的“环境子系统”,也就是“Win32子系统”。

[csrss.exe]

  

Subsystem Dynamic Libraries

由四个dll组成:

Kernel32.dll
Advapi32.dll
User32.dll
Gdi32.dll

它们实际上是Service Processes和User Applications的一部分,以dll的形式加载到它们的进程地址空间中去的。

它们的作用是向Service Processes和User Applications提供Win32 API接口。

Win32 API在实现上分为三类:

1. 完全在这四个dll的内部实现。

2. 通过这四个dll,调用更加底层的(内核态,比如内核或者驱动)实现。

3. 这四个dll与Environment Subsystem Server Processes建立C/S通信模型,dll作为client请求Win32子系统的server进程(用户态进程)来提供相应的实现。


内核态

内核态组件分为以下几类:

1. Windows Executive

可以理解为内核态的管理程序,其实就是各个模块子系统。

比如内存管理模块,进程与线程管理模块,安全模块,IO模块,网络模块,以及进程间通信模块。

2. Windows Kernel

狭义上的内核,提供内核态中的核心操作,比如线程调度与切换,中断和异常的分发与处理,以及多处理的同步等等。

它其实就是一组函数的集合。

3. Device Driver

内核态驱动。

4. HAL

Hardware Abstract Layer

用来隐藏与平台相关的细节,并且向上提供统一的API接口。

5. Windowing and Graphics System

窗口与绘图系统。用来提供GUI相关功能。

这5个组件大部分都存在于一个Ntoskrnl.exe中,当然一些第三方的driver除外。


Windows Subsystem

Windows子系统包含两部分:

即上面所描述的用户态的Environment Subsystem Service Processes和内核态的Windowing and Graphics System

用户态的Win32子系统服务进程

[csrss.exe]

Basesrv.dll
Winsrv.dll
Csrsrv.dll

向Win32 Subsystem dll代表的client提供以下功能支持:

1. Console Windows(命令行窗口,即不带GUI功能,不涉及到Win32k.sys)

2. 创建和删除Process/Thread

3. Side-by-Side(Sxs)支持

等等。

内核态的Win32k.sys驱动

提供以下功能:

1. 窗口管理器,以及与GUI相关的输入输出设备,消息传递等机制。

2. 提供GDI绘图库。

3. DirectX的支持(在另一个驱动Dxgkrnl.sys中实现)


Ntdll

与Subsystem dll不同,Ntdll是所有用户态进程与内核态进行交互的必经之路。

ntdll包含两类函数:

1. System Service Stub

这些函数是调用内核Executive组件提供的系统服务的入口函数。

函数内部包含与平台相关的代码,使代码的执行由用户态转入内核态执行,比如int 80H或者sysenter等等。

在内核中与Stub对应的是SSDT,System Service Dispatch Table,根据ntdll的stub函数传入的系统调用号,从SSDT表中选择对应的service routine执行。

2. Operating System Internal Support Functions

这部分不是给应用程序使用的,而是给用户态的操作系统组件,比如System Support Processes和Environment Subsystem Service Processes来使用。

包括下面几类:

  • Image Loader functions, Ldr[XXXX]
  • Heap Manager
  • Windows Subsystem Process Communication functions, Csr[XXXX]
  • Runtime Library Routines, Rtl[XXXX]
  • User-mode Debugging, DbgUi[XXXX]
  • Event Tracing for Windows, Etw[XXXX]
  • User-mode Asynchronous Procedure Call(APC) Dispatcher
  • Exception Dispatcher
  • subset of C Run-time(CRT)

Executive

executive,可以理解为内核的表现层

包含以下几类函数集合:

1. System Services

导出给用户态进程使用的函数,其中大部分通过API向普通应用程序开放,而少部分则只能给用户态的操作系统组件使用。

2. Device Driver

3. WDK Interface Functions

可以被内核态的驱动调用的函数,比如Zw[XXXX]

4. WDK未导出的函数

内核态的驱动也不能够调用

比如Inbv[XXXX]

5. 未导出的全局变量

Internal IO manager support functions, Iop[XXXX]

Internal Memory management support functions, Mi[XXXX]

6. 各个模块内部的函数,没有被定义为全局符号


Kernel

Kernel里面实现的是操作系统最基本的功能,比如线程调度和同步等等。

Kernel的代码是平台相关的,用来处理与平台相关的一些功能,比如中断和异常分发。

Kernel也会通过WDK接口向驱动导出一些函数,比如Ke[XXXX]

kernel与executive的区别在于,kernel几乎不做任何决策,只是提供基础的支持功能。

kernel唯一自己做决策的是线程的调度与分发。

kernel objects

kernel提供的object是最基本的对象,方便进行创建和管理。

而executive用到的objects大都是特化的object,里面包含不同的overhead,因此往往一个executive object,包含几个的kernel objects.

kernel objects分为几类:

1. Control Objects

APC objects, DPC objects, Interrupt objects

2. Dispatcher Objects

kernel thread, mutex, event, kernel event pair, semaphore, timer, waitable timer

Kernel Processor Control Region(KPCR)

用来保存与processor相关的信息,也可以理解为与平台相关的信息。

比如:

  • Interrupt Dispatcher Table(IDT)
  • Task-State Segment(TSS)
  • Global Descriptor Table(GDT)

在32位Windows操作系统中,fs:[0]可以索引到KPCR;

在x64 Windows操作系统中, gs:[0]可以索引到KPCR;

在IA64 Windows操作系统中, 0xE0000000FFFF0000可以索引到KPCR;

在KPCR中有一个内嵌的结构体叫KPRCB(Kernel Processor Control Block)

里面保存的是不公开的内容,主要是与Processor相关的信息,比如Nonpaged pool和paged pool的lookaside list就保存在KPRCB中。


HAL


Device Driver


System Processes

系统进程

1. Idle Processes

Idle 和 System是两个比较特殊的进程,因为这们不是完整意义的进程,没有实际的映像文件。

Idle Process是0号进程。

2. Interrupts and DPCs

这两个不是进程,而是中断发生时,内核提供的异步处理机制。

但是这两种全程会消耗CPU,因此为了提供更多的关于CPU使用情况的细节,许多系统监视器都会将二者列出来。

3. System Process and System Threads

4号进程。

提供了一个供内核线程运行的进程空间,但是注意,这个进程只包含内核地址空间,而不包含用户地址空间。

内核和驱动可以调用PsCreateSystemThread来创建System Thread,通常只在需要Thread Context的情况下才会创建System Thread,比如

ISR和DPC就不是System Thread。

4. Session Manager (Smss.exe)

负责初始化最后阶段的内核态进程创建了smss.exe这个进程,这是用户态的第一个进程。

Session Manager还有很多特殊的任务,比如完成delayed rename/delete file operation。

Session Manager会创建Subsystem server processes(csrss.exe),csrss.exe进程会创建剩余的system processes。

对于Session 0,smss.exe会创建wininit.exe进程,除此之外,smss.exe会为每个session创建一个Winlogon.exe进程。

5. Winlogon, LogonUI, LSASS和Userinit

SAS(Control + Alt + Delete), Secure Attention Sequence,是用来保证用户会调用到正确的Winlogon进程,因为这三个键的组合是不允许在用户态被拦截的。

Winlogon进程会在需要的情况下,创建LogonUI,用来提供用户登陆界面。

LSASS服务进程会提供认证的功能,认证成功后,lsass会创建一个access token,对于UAC情况下,对于拥有管理员权限的用户,还会创建一个权限受限的access token,并且让用户在正常情况下使用这个受限的access token。

6. Service Control Manager (SCM)

services,也就是用户态的无界面进程,和Linux的Daemon Process一样。

service进程通常不与logon user产生任何互动。

services也是正常的进程,只是它们的生命周期是通过特殊的API与SCM通信来控制的。

services可以拥有自己的执行映像,比如lsass.exe,也可以只提供一个dll,而借用通用的svchost.exe来启动进程。


Windows操作系统架构的更多相关文章

  1. Windows操作系统

    Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...

  2. Windows系统架构

    操作系统模型   大多数操作系统中,都会把应用程序和内核代码分离运行在不同的模式下.内核模式访问系统数据和硬件,应用程序运行在没有特权的模式下(用户模式),只能使用有限的API,且不能直接访问硬件.当 ...

  3. windows 操作系统发展过程

    1.Windows 1.0 1985年5月推出Windows 1.0,是比尔.盖茨在苹果公司的Apple Lisa系统的GUI界面上得到的启发.Windows 1.0的GUI(图形用户界面)是基于字符 ...

  4. Windows 操作系统

    Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...

  5. Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取

    为什么要写这篇文章 1.      因为最近在学习<软件调试>这本书,看到书中的某个调试历程中讲了Windows的系统调用的实现机制,其中讲到了从Ring3跳转到Ring0之后直接进入了K ...

  6. [转]在 Windows 操作系统中的已知安全标识符(Sid security identifiers)

    安全标识符 (SID) 是用于标识安全主体或安全组在 Windows 操作系统中的可变长度的唯一值.常用 Sid 的 Sid 标识普通用户的一组或通用组.跨所有操作系统,它们的值保持不变. 此信息可用 ...

  7. Windows操作系统深入解析原理

    Windows运用程序编写插口(API)是对于Windows电脑操作系统大家族的客户方式系统软件程序编写插口.在32位版本号的Windows营销推广之前,31位版本号Windows电脑操作系统的程序编 ...

  8. Windows操作系统下远程连接MySQL数据库

    用Eclipse做一个后台项目,但是数据库不想放在本地电脑,于是买了一个腾讯云服务器(学生有优惠,挺便宜的),装上MySQL数据库,但是测试连接的时候,发现总是连接不是上,但是本地数据库可以连接,于是 ...

  9. 深入解析Windows操作系统笔记——CH1概念和术语

    1.概念和工具 本章主要介绍Windows操作系统的关键概念和术语 1.概念和工具 1.1操作系统版本 1.2基础概念和术语 1.2.1Windows API 1.2.2 服务.函数和例程 1.2.3 ...

随机推荐

  1. Windows 08R2 IIS网站架设

    目录 目录 配置和安装IIS 环境设置 安装IIS服务器 网站的站点目录和欢迎页面 配置和安装IIS IIS是Windows的网站服务器,所以配置IIS服务的前提是需要一个网址.和DNS域名并添加主机 ...

  2. T1215:迷宫

    [题目描述] 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某 ...

  3. LeetCode 数组中两个数的最大异或值

    题目链接:https://leetcode-cn.com/problems/maximum-xor-of-two-numbers-in-an-array/ 题目大意: 略. 分析: 字典树 + 贪心. ...

  4. FVWM使用指南

    www.ctex.org/documents/shredder/fvwm_frame.html

  5. 博弈的dfs

    题目: 链接:https://ac.nowcoder.com/acm/contest/283/D来源:牛客网 小西买了一堆肥宅快乐水和肥宅快乐茶,准备和室友比谁更肥宅. 快乐水有A瓶,快乐茶B瓶. 小 ...

  6. shell 脚本学习(一)

    一.vi编辑器的常用指令 1.命令行模式 x   #删除一个字符 dd #删除一整行 2.插入模式 i #在光标前插入内容 o   #在当前行之下新开一行 3.底行模式 x 或者 wq  #保存退出 ...

  7. SpringBoot2.x整合Shiro(一)

    一:什么是ACL和RBAC: ACL: Access Control List 访问控制列表 以前盛行的一种权限设计,它的核心在于用户直接和权限挂钩 优点:简单易用,开发便捷 缺点:用户和权限直接挂钩 ...

  8. scroll兼容性

    document.html=>document.documentElement function scroll() { if(window.pageYOffset != null) // ie9 ...

  9. Es学习第六课, ES基本搜索_search

    前面几课ES的基本概念.安装和分词都讲过了,下面我们就来实战一下ES的核心功能-搜索,这节课我们主要讲的是基本搜索 _search(注意:ES的关键字都要加前缀_,所以我们在定义索引.类型名称时不要带 ...

  10. jQuery的ajaxFileUpload上传文件插件刷新一次才能再次调用触发change

    jQuery的ajaxFileUpload插件 关于用ajaxfileupload时,遇到一个要刷新一次页面才能再次上传,用live()方法来绑定 file表单 的change事件就能够解决,直接$( ...