1. 程式人生 > >Windows核心情景分析-概述

Windows核心情景分析-概述

現在的Windows

現在的windows核心包含了兩大部分,一部分是本來意麵上的作業系統核心,另一部分則是移到了核心中的視窗服務,前者對應ntoskrnl.exe後者win32k.sys;後者部分為了保證效率。windows作業系統包含多個子系統,最常用就是windows子系統;貌似現在的windows10提供了linux子系統,所以在windows上可以執行linux的程式。

現代意義上的作業系統

第一,作業系統的區域受到保護,不會因為使用者程式的錯誤而損壞,分使用者程式空間和核心空間,核心空間受到保護。

第二,不用應用程式之間互相防護,一個程式的錯誤不影響另一個應用程式。

第三,程式在實體記憶體中的位置可以浮動,允許多程式同時執行。

windows系統結構

windows作業系統分使用者空間和系統空間,32bitOS 0~0x7fffffff屬於使用者空間,0x80000000~0xffffffff屬於作業系統空間。使用者空間屬於特定程序,核心空間是共享的;核心空間只有當cpu處於系統態才可以訪問,程序空間則都可以訪問。CPU通過三種方式進入系統態,分別為“系統呼叫”、“中斷”、“異常”。

 Windows IRQL

windows與Linux核心不同,其核心相當一部分的頁面是可倒換的,但並非所有,例如中斷和異常的有關程式碼和資料所在頁面,以及和頁面倒換相關程式碼資料就是不可倒換。Windows為CPU執行狀態定義了很多IRQL,在任一時間,CPU總是為其中某一個級別,這個級別表名哪些操作可以做哪些操作不可以。基本意圖為,如果CPU處於某一個級別,其操作就不能被低級別的操作所幹擾。使用者空間無法更改IRQL,IRQL定義如圖:

接上,關注PASSIVE_LEVEL、APC_LEVEL、DISPATCH_LEVEL,級別 >= 3用於硬體中斷 。上面所說中斷和異常程式碼資料所在頁面是不允許置換,可能因為:中斷處理內部不允許執行緒切換(具體原因?),所以無法切換到處理置換的執行緒(單獨核心執行緒處理該操作),而待執行的程式碼又已經置換到磁碟上,無法置換入記憶體,所以這裡就行不通;此外,執行緒切換必須等到IRQL從DISPATCH_LEVEL降下來。在頁面置換問題上,只要CPU的IRQL級別不高於APC_LEVEL的層次,其程式碼都是執行置換的,因為允許執行緒切換到核心負責置換的執行緒。在windows中管理層程式碼中幾乎所有函式開頭放上巨集PAGED_CODE(),說明作者意圖該函式可置換,通過 #pragma alloc_text(PAGE,NtQueryObejct)編譯時將程式碼放在可置換區。

windows核心函式命名 

 瞭解命名規則對於後面理解函式有幫助,可以一眼看出該函式的大概作用。