Windows操作系統架構


 

用戶態

用戶態有四類組件,這四類組件都是以進程形式存在的,也就是說,它們都有自己的進程地址空間(其實就是一套頁表)。

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來啟動進程。

 

 


 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM