Windows操做系统架构

 

用户态

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

1. System Support Processes

这些是固化的进程,也就是说是操做系统结合在一块儿的进程。api

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

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还早。session

Task Scheduler和Print Spooler都是services。异步

Service Host    [svchost.exe]

  

3. User Applications

就是常说的应用程序。ide

4. Environment Subsystem Server Processes

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

[csrss.exe]

  

 

Subsystem Dynamic Libraries

由四个dll组成:post

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来启动进程。

 

 


 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/long123king/p/3782442.html