了解WINDOWS內核的關鍵組件和功能

作者: GUO Xingwang  來源: 博客園  發布時間: 2010-12-26 21:42  閱讀: 1191 次  推薦: 0   原文鏈接   [收藏]  

  通過WRK可以了解到,WINDOWS內核絕大部分源代碼是由C語言實現,只有部分與處理器相關的調度代碼是通過匯編語言實現。最近半年我對WINDOWS平臺本身有很高的興趣,其實我作為應用程序開發人員對于WINDOWS內核沒有必要知道的太多,但是了解下不僅對我應用程序排查問題有幫助,而且WINDOWS內核中有很多良好的設計也是我們應用開發人員值得學習的,例如說內存堆管理,IO體現等,甚至可以引用到自己的項目中。很多程序員和架構師每天圍繞WINDOWS展開工作,因為我們的程序就是基于WINDOWS的,WINDOWS占領了PC的市場,關鍵是不得不用。我們開發的程序可以認為是WINDOWS能力的擴展,在WINDWOS平臺下的主要擴展方式有以下幾種:窗體應用程序,控制臺應用程序,服務程序,驅動程序(可以認為是內核模塊的擴展),本地程序。

1.擴展類型

  窗體應用程序:這個大家最熟悉不過了,直接用MFC寫一個窗體程序,用Winform寫一個窗體程序。窗體程序一般都需要在某個用戶的Session的桌面中運行,基于WINDOWS子系統,采用GDI做顯示輸出技術,基于WINDOWS的消息機制,有消息循環和窗體函數,所以窗體程序會有大量的GDI對象生成,窗體應用程序也是WINDOWS作為客戶端系統最為普遍的應用。

  控制臺應用程序:控制臺的程序是最早的DOS下16位應用在WINDOWS下的兼容方式(不過現在已經是32位為主了),有標準輸入,標準輸出和標準錯誤,一般是作為計算機管理人員使用。控制臺程序與WINDWOS窗體應用的運行機制完全不同,窗體程序是基于GDI,內核級由win32k.sys處理,而控制臺應用程序一般由csrss.exe(下文會有介紹)管理。

  服務程序:這是WINDOWS作為服務器端應用時普遍采用的方式,具有守護特性(無需用戶登錄無需退出),類似與LINUX下的DAEMON進程,服務程序的運行不需要用戶登錄,一般由LOCAL SERVICE,NETWORK SERVICE,SYSTEM用戶運行,所以沒有用戶界面,所以成為服務器端的主要應用方式是因為這種服務程序很多都是使用線程池來做IO處理,例如處理網絡連接和數據庫操作等。此前之前有人試圖在WINDOWS服務中啟動用戶界面程序,雖然可能通過一些技巧會實現,但是這種不是服務程序設計的初衷,只能說明應用架構設計的不合理。

  驅動程序:這里的驅動程序特指運行在WINDOWS內核模式下的擴展模塊或設備驅動程序,WINDOWS內核通過IO管理器等執行體模塊對驅動程序進行管理,可以是協議驅動程序,設備驅動程序,文件系統驅動程序等,一般基于一定的驅動程序開發模型由第三方提供。此外WINDOWS對于驅動程序的一個映像只允許加載一次,也就是說兩個驅動程序不能使用同一個映像文件。

  本地程序:這個可能大家最為陌生,本地程序不是我們常說的WIN32本地程序,WIN32本地程序是指基于WINDOWS子系統的本地代碼程序。而這里的本地程序是WINDOWS的原生程序,一般直接基于ntdll.dll,而不是基于user32.dll,kernel32.dll等子系統dll。舉個例子就是WINDOWS的第一個用戶態進程smss.exe,完成會話管理任務和啟動一些其他子系統進程。還有就是我們常用的瑞星殺毒軟件在啟動的時候會執行內核掃描,實際上這個程序就是本地程序。

  所有以上程序都可以使用VS開發,只是改變一些配置選項,需要安裝例如WINDOWS SDK和WINDOWS DDK等開發包。

其他一些擴展,例如WINDOWS的SHELL程序explorer.exe的擴展,IE瀏覽器的插件,還有就是登錄認知的GINA擴展等。目前SHELL編程已經成為獨立的開發方向。

2.內核模塊

  看一副經典的圖片吧,這是一幅WINDOWS內核組件的原圖,這里的內核是指大內核,而不是圖中的kernel的微內核,微內核是特指線程調度模塊。

  在WINDOWS中可執行的代碼在CPU上運行時會有用戶模式和內核模式兩種,CPU不是工作在內核模式就是工作在用戶模式,一般用戶模式在CPU的低權限級別運行,當線程運行在用戶模式時只能訪問進程空間的資源,對于32位系統只能使用2GB以下地址空間(最大3GB),如果需要訪問其他資源需要陷入內核模式。當線程工作在內核態時能夠訪問到4GB全地址空間,包括系統空間的映射。圖中NTDLL正是將用戶態和內核態隔開的模塊,NTDLL通過特殊的CPU指令可以進入內核態,反之亦然。
  用戶態中包括應用程序,子系統,服務和一些系統管理進程,最后都是通過NTDLL進入內核態的。
  內核態中包括SDT(服務分發表,系統線程),執行體(包括內存管理,進程線程管理,IO管理等),微內核(調度)。此外還包括第三方的驅動程序(其實很多也是MICROSOFT提供的),和WINDOWS的子系統內核模塊win32k.sys。
內核態還有一個很重要的hal.dll,實現WINDOWS內核的跨平臺(硬件平臺)。

3.重要文件

  Ntoskrnl.exe: 包含執行體和內核部分,是大內核的主要部分,完全運行在內核態,可以說是WINDOWS系統的核心部分。WRK的源代碼就是這一部分。

  Ntkrnlpa.exe (32位): Ntoskrnl的PAE版本。

  Hal.dll:硬件抽象層,WINDOWS的跨平臺特性很多就要從這個文件說起,一共大概4個版本,在WINDOWS系統安裝時會根據硬件平臺選擇一個進行拷貝之后重命名。

  Win32k.sys: WINDOWS子系統的內核部分,包括了消息,圖形的內核部分等。窗口顯示;鼠標、鍵盤輸入接收;傳遞用戶消息,GDI。

  Ntdll.dll:用戶態子系統DLL。

  Kernel32.dll,Advapi32.dll,User32.dll,Gdi32.dll:一些用戶態的WINDOWS子系統DLL,WINDOWS共支持三種子系統WINDOWS,POSIX,OS/2。將documented Windows API映射到undocumented的kernel-mode system service call。

  Csrss.exe:Console管理,創建/銷毀進程和線程,支持16位進程。

  Ntdll.dll:User-mode應用調用到Windows executive system service的接口,Subsystem, native images的內部支持。

  Idle process:一個CPU一個線程,用來計算CPU空閑時間,進程編號為0,一般由WINDOWS的初始化程序退化而成。無映像文件。

  System process系統,進程編號為4,一些系統線程會被附加在此進程中,無映像文件。

  Smss.exe:第一個user-mode進程。

  Winlogon.exe:登錄界面。可替換。GINA。

  Services.exe and Svchost.exe:服務管理和宿主進程。

  Lsass.exe:驗證用戶登錄信息。

  Userinit.exe:  初始化用戶信息,執行shell程序(explorer.exe)。

4.重要部分

  內存管理
  同步和線程調度
  IO系統
  服務分發
  進程通信
  網絡系統
  文件系統
  WINDOWS子系統

5.推薦資源

  《WINDOWS核心編程》
  《深入解析WINDOWS內核》
  《WINDOWS內核原理與應用》
  Sysinternals工具

0
0
 
標簽:WINDOWS內核
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()