Windows操作系统架构

Autumn ·
更新时间:2024-09-20
· 810 次阅读

  用户态   用户态有四类组件,这四类组件都是以进程形式存在的,也是说,它们都有自己的进程地址空间(其实是一套页表)。   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 架构

需要 登录 后方可回复, 如果你还没有账号请 注册新账号