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;
#else
PVOID 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 2
union {
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结构中,许多域都与线程调度机制有关: