typedef struct _KPROCESS {
//
// The dispatch header and profile listhead are fairly infrequently
// referenced.
//
DISPATCHER_HEADER Header; //表明KPROCESS也是一个分发器对象(dispatcher object)
LIST_ENTRY ProfileListHead; //用于当该进程参与性能分析时,作为一个节点加入到全局的性能分析进程列表(内核全局变量KiProfileListHead)
//
// The following fields are referenced during context switches.
//
ULONG_PTR DirectoryTableBase[2]; //DirectoryTableBase[0]:指向该进程的页目录表地址;DirectoryTableBase[1]:指向该进程的超空间的页目录表地址
#if defined(_X86_)
KGDTENTRY LdtDescriptor; //LDT(局部描述符表)
KIDTENTRY Int21Descriptor; //为了兼容dos,允许他们通过int 21h指令来调用DOS系统功能
USHORT IopmOffset; //IOPM位置:内核通过IOPM可控制进程的用模式I/O访问权限
UCHAR Iopl; //I/O优先级
BOOLEAN Unused;
#endif
#if defined(_AMD64_)
USHORT IopmOffset;
#endif
volatile KAFFINITY ActiveProcessors; //记录了当前进程正在哪个处理器上运行,与下面KernelTime,UserTime有关
//
// The following fields are referenced during clock interrupts.
//
ULONG KernelTime; //记录了进程对象在内核模式下所花的时间
ULONG UserTime; //记录了进程对象在用户模式下所花的时间
//
// The following fields are referenced infrequently.
//
LIST_ENTRY ReadyListHead; //双向链表的表头,该链表记录了这个进程中处于就绪状态但尚未假如全局就绪链表的线程,请看 注1
SINGLE_LIST_ENTRY SwapListEntry; //单链表,当一个进程被换出(入)内存时,它通过此域加入到全局
//变量KiProcessOutSwapListHead(KiProcessInSwapListHead)链表中
#if defined(_X86_)
PVOID VdmTrapcHandler; //指向处理Ctrl+C中断的函数(VDM 虚拟DOS机)
#else
PVOID Reserved1;
#endif
LIST_ENTRY ThreadListHead; //此链表包含了该进程的所有当前线程。线程初始化的时候加入到该链表,线程终止的时候从该链表中移出
KSPIN_LOCK ProcessLock; //自旋锁对象(保护此进程中的数据成员)
KAFFINITY Affinity; //指定了该进程的线程可以在哪些处理器上运行
//
// N.B. The following bit number definitions must match the following
// bit field.
//
// N.B. These bits can only be written with interlocked operations.
//
#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; //用于指定一个进程的线程的优先级,所有线程在启动的时候都会继承这个值
SCHAR QuantumReset; //指定一个进程中线程的基本时限重置值
UCHAR State; //说明了一个进程是否在内存中,共有六种状态,见注2
UCHAR ThreadSeed; //用于该进程选择适当的理想处理器
UCHAR PowerState; //用于记录电源状态
UCHAR IdealNode; //用于为一个进程选择优先的处理器节点
BOOLEAN Visited; //WRK中未使用
union {
KEXECUTE_OPTIONS Flags;
UCHAR ExecuteOptions; //设置进程内存执行选项
};
#if !defined(_X86_) && !defined(_AMD64_)
PALIGNMENT_EXCEPTION_TABLE AlignmentExceptionTable;
#endif
ULONG_PTR StackCount; //记录了当前进程中有多少个线程的栈位于内存中
LIST_ENTRY ProcessListEntry; //将当前系统中所有具有活动线程的进程串成一个链,表头为KiProcessListHead(仅用在AMD64下)
} KPROCESS, *PKPROCESS, *PRKPROCESS;
注1:LIST_ENTRY ReadyListHead 该链表的意义在于,当一个进程被换出内存以后,它所属的线程一旦就绪,就会挂入这个表中,并要求换入进程;之后
当该进程再次换入内存时,ReadyListHead中的所有线程被加入到系统全局就绪线程链表中。ReadyListHead的每一项都指向一个KTHREAD对象的WaitList域
的地址,所以从链表中的每一项都能定位到一个线程对象。
注2:ProcessInMemory、ProcessOutOfMemory、ProcessInTransition、ProcessOutTransition、ProcessInSwap、ProcessOutSwap
总结:KPROCESS对象中记录的信息主要包括两类:一类跟进程内存环境相关,比如与目录表,交换状态等;
另一类是与其线程相关的一些属性,比如线程列表以及线程所需要的优先级、时限设置等、
系统的总进程列表是在执行体层管理的(EPROCESS结构)
《Windows内核原理与实现》第三章学习笔记---KPROCESS学习
最新推荐文章于 2022-09-25 11:26:20 发布