用户态

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

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. 面试题57:数组中2个数的和(也是leetcode题目)

    题目:给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因 ...

  2. 嵌入式C语言4.1 C语言内存空间的使用-指针

    指针:就是内存资源的地址.门牌号的代名词 假如你所在的城市是一个内存(存储器),如果找到你家,就是通过你的家庭住址(指针)寻找,而你家里的摆设面积之类的就是内存的内容(指针指向的内容). 指针变量:存 ...

  3. jQuery设置checkbox 为选中状态

    1设置第一个checkbox 为选中值$('input:checkbox:first').attr("checked",'checked');或者$('input:checkbox ...

  4. python Condition类(锁)

    Condition(条件变量)通常与一个锁关联.需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例. 不理解锁的,请看上一条 ...

  5. W3C、MDN及html常用标签介绍

    W3C 万维网(World Wide Web)是作为欧洲核子研究组织的一个项目发展起来的,在那里 Tim Berners-Lee 开发出万维网的雏形.Tim Berners-Lee- 万维网的发明人和 ...

  6. java环境搭建与安装开发工具全教程

    当前端的后台搭档是做java后台时,这时就需要自己搭建一个java开发环境,和安装eclipse了. 那么,一般这些开发环境在一个开发团队中是统一的.正规完善的公司还会有自己软件库和安装配置文档.这时 ...

  7. redis-3.0.0安装

    redis-3.0.0安装 前言 redis是常用的no-sql数据库,常用于缓存数据,同时,他也可以持久化数据.他是C语言开发的,所以安装的时候需要编译. 单机版redis yum install ...

  8. IDisposable实现的方法什么时候被执行的

    一,以什么是GC所认为的垃圾? 不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收 二,在仓储设计中,我们都知道非托管资源的手动释放,但继承的IDisposa ...

  9. 从现在开始强迫自己使用 Reflect

    静态方法 Reflect.apply(target, thisArg, args) 等同于 Function.prototype.apply.call(func, thisArg, args) Ref ...

  10. js常用转义字符列表

    转义字符 含义 \n 换行 \t 制表符 \b 空格 \r 回车 \f 换页符 \ 反斜杠 ' 单引号 '' 双引号 \0nnn 八进制代码 nnn 表示的字符( n 是 0 到 7 中的一个八进制数 ...