Windows核心中執行體層負責各種與管理和策略相關的功能,而核心層(或微核心)實現了作業系統的核心機制。
核心層的進程和線程對象
核心層中線程和進程中的資料結構分別是KPROCESS和KTHREAD。其中KPROCESS的定義為:
typedef struct _KPROCESS {//這兩個頭部很少被使用 DISPATCHER_HEADER Header;//用於當該進程參與效能分析(profiling)時,作為一個節點加入到全域的效能分析進程列表(KiProfileListHead)LIST_ENTRY ProfileListHead;//環境切換時會用到的欄位//第一項指向該進程的頁目錄表地址//第二項指向該進程的超空間(hyper space)的頁目錄位址ULONG_PTR DirectoryTableBase[2];#if defined(_X86_)//LDT描述符 KGDTENTRY LdtDescriptor;//相容DOS程式,允許通過int 21h來調用DOS系統功能KIDTENTRY Int21Descriptor;//I/O許可權表,I/O Privilege Map USHORT IopmOffset;//IOPM可控制進程的使用者模式I/O存取權限;Iopl域定義了進程的I/O優先順序 UCHAR Iopl;BOOLEAN Unused;#endif#if defined(_AMD64_)USHORT IopmOffset;#endif//當前進程記錄了當前進程正在哪些處理器上運行volatile KAFFINITY ActiveProcessors;//當時鐘中斷髮生的時候,下列兩個域會被引用,記錄了使用者模式和核心模式下所花的時間,線程結束時才進行更新ULONG KernelTime;ULONG UserTime;//下面兩個域很少被引用到//該鏈表記錄了這個進程中處於就緒狀態但尚未被加入到全域就緒鏈表中的線程 LIST_ENTRY ReadyListHead;//當進程要被換出記憶體時,通過這個網域加入到KiProcessOutSwapListHead中//當進程要被換入記憶體時,通過這個網域加入到KiProcessInSwapListHead中SINGLE_LIST_ENTRY SwapListEntry;#if defined(_X86_)//指向處理Ctrl+C中斷的函數,僅用於VDM(虛擬DOS機)環境下運行16位程式。PVOID VdmTrapcHandler;#elsePVOID Reserved1;#endif//此鏈表包含了該進程的所有當前進程LIST_ENTRY ThreadListHead;//自旋鎖對象,保護此進程中的資料成員KSPIN_LOCK ProcessLock;//指定了該進程的線程可以在哪些處理器上運行,其二進位表示的每一位分別對應於當前電腦的一個處理器(核)KAFFINITY Affinity;//接下來定義的位必須與接下來的位欄位相符//這些位只能使用互鎖操作進行寫入#define KPROCESS_AUTO_ALIGNMENT_BIT 0#define KPROCESS_DISABLE_BOOST_BIT 1#define KPROCESS_DISABLE_QUANTUM_BIT 2union {struct {LONG AutoAlignment : 1;LONG DisableBoost : 1;LONG DisableQuantum : 1;LONG ReservedFlags : 29;};LONG ProcessFlags;};//指定進程中的線程的基本優先順序SCHAR BasePriority;//QuantumReset指定一個進程中線程的基本時限重設值SCHAR QuantumReset;//指明進程是否在記憶體中 UCHAR State;//用於為該進程的線程選擇適當的理想處理器UCHAR ThreadSeed;//用於記錄電源狀態UCHAR PowerState;//為一個進程選擇優先的處理器節點UCHAR IdealNode;//WRK中未使用BOOLEAN Visited;union {KEXECUTE_OPTIONS Flags;//設定一個進程的記憶體執行選項,為了支援NX(No-Execute,記憶體不可執行)UCHAR ExecuteOptions;};#if !defined(_X86_) && !defined(_AMD64_)PALIGNMENT_EXCEPTION_TABLE AlignmentExceptionTable;#endif//記錄當前進程中有多少個線程的棧位於記憶體中ULONG_PTR StackCount;//將當前系統中所有具有活動線程的進程串成一個鏈表LIST_ENTRY ProcessListEntry;} KPROCESS, *PKPROCESS, *PRKPROCESS;
每一個進程都對應一個KPROCESS對象。KPROCESS中主要記錄了兩類資訊:一類跟進程的記憶體環境相關,一類是與其線程相關的一些屬性。
KTHREAD結構中,許多域都與線程調度機制有關: