KTHREAD 结构体属性介绍
typedef struct _KTHREAD {//// The dispatcher header and mutant listhead are fairly infrequently// referenced.//DISPATCHER_HEADER Header; // KTHREAD 是可等待对象,线程结束时有信号// 此链表存储了属于该线程的所有 mutant(对应3环的 mutex)// 一旦该线程获得了 mutex ,则 mutex 挂入该链表LIST_ENTRY MutantListHead;//// The following fields are referenced during context switches and wait// operatings. They have been carefully laid out to get the best cache// hit ratios.// 下面的域布局精心设计以提高 cache 命中率PVOID InitialStack; // 原始栈底PVOID StackLimit; // 栈顶的最低地址(栈界限)PVOID KernelStack; // 内核栈顶esp,线程切换时保存esp到这里// 自旋锁对象,用于保护线程数据成员KSPIN_LOCK ThreadLock;// KAPC_STATE 存储了该线程的APC信息,包括用户/内核APC链表,当前所属进程(父进程或挂靠进程)// 是否正在执行内核APC,是否有要执行的用户/内核APCunion {KAPC_STATE ApcState;struct {// 用来占用一个 KAPC_STATE 的大小UCHAR ApcStateFill[KAPC_STATE_ACTUAL_LENGTH];BOOLEAN ApcQueueable; // 是否可以插入APCvolatile UCHAR NextProcessor; // 处理器调度相关volatile UCHAR DeferredProcessor; // 处理器调度相关UCHAR AdjustReason; // 优先级调整的原因SCHAR AdjustIncrement; // 优先级调整量};};// 自旋锁对象,用于保护APC队列操作KSPIN_LOCK ApcQueueLock;#if !defined(_AMD64_)ULONG ContextSwitches; // 记录线程切换次数volatile UCHAR State; // 9种线程状态,见 _KTHREAD_STATE ,1就绪,2运行,5等待UCHAR NpxState; // 浮点寄存器状态,本书不讨论KIRQL WaitIrql; // 配合 WaitNext 使用,详见 WaitNext 注释KPROCESSOR_MODE WaitMode; // 线程等待时的处理器模式,0内核,1用户#endifLONG_PTR WaitStatus; // 等待的结果状态union {// 指向一个以 KWAIT_BLOCK 为元素的链表// KWAIT_BLOCK 对象指明了哪个线程在等待哪个分发器对象// 对于分发器对象,它又有另一个 KWAIT_BLOCK 链表指明哪些线程正在等待它// 细节要等到 5.4 节介绍线程同步机制时才能知道PKWAIT_BLOCK WaitBlockList;// 记录了正在等待的门对象(也是一种分发器对象)PKGATE GateObject;// 等待门对象和等待其他分发器对象不会同时发生,所以放在一个共用体里了};BOOLEAN Alertable; // 线程等待时,是否可以被唤醒// WaitNext == TRUE 表示这个线程马上要调用一个内核等待函数,所以不必解除线程调度器锁// WaitNext == TRUE 时,WaitIrql 记录了原先的 IRQL 值。BOOLEAN WaitNext;// 记录线程等待的原因,见 KWAIT_REASON 枚举类型,但不参与线程调度或决策UCHAR WaitReason;SCHAR Priority; // 动态优先级值UCHAR EnableStackSwap; // 本线程的内核栈是否允许被换出内存volatile UCHAR SwapBusy; // 本线程当前是否正在进行上下文切换BOOLEAN Alerted[MaximumMode]; // 长度为2的数组,指定该线程在内核/用户模式是否可以被唤醒union {// 线程等待被执行时,通过此节点挂入 ThreadListEntry 链表(KPROCESS/EPROCESS成员)LIST_ENTRY WaitListEntry;// 当线程的内核栈需要被换入时,插入到全局链表 KiStackInSwapListHead 中// 当线程状态为 DeferredReady 时,插入到某个CPU的 DeferredReadyListHead 链表中SINGLE_LIST_ENTRY SwapListEntry;};// 队列分发器对象,如果不为NULL,说明当前线程正在处理此队列对象中的项PRKQUEUE Queue;#if !defined(_AMD64_)// 记录该线程进入等待时刻的时间点(时钟滴答值的低32位),// 用于平衡集管理器根据线程等待时间的先后来做一些决策,详见第4章ULONG WaitTime;union {struct {// 0表示不禁用APC,负数表示禁用APC// 线程执行过程中,有多种因素要禁止APC,这些因素以负值累加,// 当因素消除时,再减去相应的负值,只有当 KernelApcDisable / SpecialApcDisable// 等于0时,才允许插入或提交APC// 禁用普通内核APCSHORT KernelApcDisable;// 禁用特殊内核APCSHORT SpecialApcDisable;};ULONG CombinedApcDisable;};#endif// 指向进程地址空间中的一个TEB(线程环境块)结构// TEB 包含了3环需要访问的各种信息,如线程相关的GDI信息、系统支持的异常等// TEB 定义在 public\sdk\inc\pebteb.hPVOID Teb;union {// 线程定时器,用于实现可超时的等待,如 KeWaitForSingleObject 会用到此定时器对象KTIMER Timer;struct {UCHAR TimerFill[KTIMER_ACTUAL_LENGTH];//// 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 KTHREAD_AUTO_ALIGNMENT_BIT 0
#define KTHREAD_DISABLE_BOOST_BIT 1union {struct {LONG AutoAlignment : 1; // 继承自 KPROCESSLONG DisableBoost : 1; // 继承自 KPROCESSLONG ReservedFlags : 30;};LONG ThreadFlags;};};};union {// 包含4个KWAIT_BLOCK的数组,其中第4项专门用于可等待的定时器对象// KWAIT_BLOCK 结构代表一个线程正在等待一个分发器对象,或者说// 一个分发器对象正在被一个线程等待,他会被同时加入到两个双链表结构中。// 内核实现等待功能时,如果等待的对象数量少于4(3个分发器对象加上一个定时器对象),// 则无需额外分配 KWAIT_BLOCK 对象的内存,只需直接使用 WaitBlock 数组即可。// 如果等待的对象数量大于4,则内核必须分配额外的 KWAIT_BLOCK 对象内存。// 等待操作在内核中非常频繁,所以利用静态数组来满足大多数情况下的内存需求,详见5.4节KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];struct {UCHAR WaitBlockFill0[KWAIT_BLOCK_OFFSET_TO_BYTE0];BOOLEAN SystemAffinityActive;};struct {UCHAR WaitBlockFill1[KWAIT_BLOCK_OFFSET_TO_BYTE1];CCHAR PreviousMode;};struct {UCHAR WaitBlockFill2[KWAIT_BLOCK_OFFSET_TO_BYTE2];UCHAR ResourceIndex;};struct {UCHAR WaitBlockFill3[KWAIT_BLOCK_OFFSET_TO_BYTE3];UCHAR LargeStack;};#if defined(_AMD64_)struct {UCHAR WaitBlockFill4[KWAIT_BLOCK_OFFSET_TO_LONG0];ULONG ContextSwitches;};struct {UCHAR WaitBlockFill5[KWAIT_BLOCK_OFFSET_TO_LONG1];volatile UCHAR State;UCHAR NpxState;KIRQL WaitIrql;KPROCESSOR_MODE WaitMode;};struct {UCHAR WaitBlockFill6[KWAIT_BLOCK_OFFSET_TO_LONG2];ULONG WaitTime;};struct {UCHAR WaitBlockFill7[KWAIT_BLOCK_OFFSET_TO_LONG3];union {struct {SHORT KernelApcDisable;SHORT SpecialApcDisable;};ULONG CombinedApcDisable;};};#endif};// 记录了线程在处理一个队列项时挂入队列对象的线程链表中的节点地址,详见5.4.2节LIST_ENTRY QueueListEntry;//// The following fields are accessed during system service dispatch.//// 指向 KTRAP_FRAME 的指针,KTRAP_FRAME 存储了 x86 所有常用寄存器// KTRAP_FRAME 用于线程切换时保存寄存器PKTRAP_FRAME TrapFrame;// 线程的回调栈地址,此栈在该线程从0环回3环时使用PVOID CallbackStack;// 指向该线程使用的系统服务表(全局变量 KeServiceDescriptorTable)// 如果这是一个GUI线程,那么此值指向影子系统服务表(KeServiceDescriptorTableShadow)PVOID ServiceTable;#if defined(_AMD64_)ULONG KernelLimit;#endif//// The following fields are referenced during ready thread and wait// completion.//// 当前APC状态在 ApcStatePointer 数组中的索引// 标识当前线程处于什么状态:0 正常状态 1 挂靠状态UCHAR ApcStateIndex;// 多处理器机器上该线程的理想处理器UCHAR IdealProcessor;// 是否被高优先级的线程抢占了,只有当一个线程正在运行或正在等待运行而被高优先级线程抢占,// 这个值才置1,其他时候总是0BOOLEAN Preempted;// 线程是否在所属进程 KPROCESS 对象的 ReadyListHead 链表中BOOLEAN ProcessReadyQueue;#if defined(_AMD64_)PVOID Win32kTable;ULONG Win32kLimit;#endif// 内核栈是否驻留在内存中,内核栈换出内存时置0,换入内存时置1BOOLEAN KernelStackResident;// 静态优先级值,继承自 KPROCESS// 可通过KeSetBasePriorityThread 函数重新设定SCHAR BasePriority;// 优先级动态调整过程中的递减值,参见 KiComputeNewPriority 函数// 优先级分为两个区域,0-15是普通线程优先级;16-31是实时线程优先级,优先级调整不会跨区域。SCHAR PriorityDecrement;// Saturation 说明了线程基本优先级相对于进程基本优先级的调整量是否超过整个区间的一半// 取值范围是 0, 1, -1CHAR Saturation;// 线程的用户亲和性,初始化时继承自 KPROCESS,可通过 KeSetAffinityThread 函数修改KAFFINITY UserAffinity;// 指向线程的父进程对象,线程初始化时指定,见 KeInitThread 函数PKPROCESS Process;// 该线程的CPU亲和性,线程初始化时继承自 KPROCESS// 为线程指定的CPU集合必须是其进程的亲和性CPU集合的子集// Affinity 的值可能有两种设置:一是系统亲和性,当该线程执行系统任务时通过// KeSetSystemAffinityThread 函数来设置;二是线程本身的亲和性,称为用户// 亲和性,通过 KeRevertToUserAffinityThread 函数来设置。KAFFINITY Affinity;//// The below fields are infrequently referenced.//// 配合 ApcStateIndex 使用,ApcStatePointer[ApcStateIndex] 总是指向所属进程,// 正常情况下所属进程是父进程,挂靠情况下所属进程指的是挂靠进程。// 详细信息请参考 5.2.6节关于APC机制的介绍PKAPC_STATE ApcStatePointer[2];union {KAPC_STATE SavedApcState;struct {UCHAR SavedApcStateFill[KAPC_STATE_ACTUAL_LENGTH];CCHAR FreezeCount;CCHAR SuspendCount;UCHAR UserIdealProcessor;UCHAR CalloutActive;#if defined(_AMD64_)BOOLEAN CodePatchInProgress;#elif defined(_X86_)UCHAR Iopl;#elseUCHAR OtherPlatformFill;#endif};};// 指向windows子系统管理的区域PVOID Win32Thread;// 当前栈底,线程初始化时,此值等于 InitialStackPVOID StackBase;union {// 初始化成一个专门的APC,当该APC被插入并交付时,调用 KiSuspendThread 函数,// 其执行结果是在线程的 SuspendSemaphore 信号量上等待,直到该信号量有信号,// 然后该线程被唤醒,继续执行。线程的挂起操作正是通过这一机制实现的,详见// KeSuspendThread 和 KeFreezeAllThreads 函数。KAPC SuspendApc;struct {UCHAR SuspendApcFill0[KAPC_OFFSET_TO_SPARE_BYTE0];SCHAR Quantum;};struct {UCHAR SuspendApcFill1[KAPC_OFFSET_TO_SPARE_BYTE1];UCHAR QuantumReset;};struct {UCHAR SuspendApcFill2[KAPC_OFFSET_TO_SPARE_LONG];ULONG KernelTime;};struct {UCHAR SuspendApcFill3[KAPC_OFFSET_TO_SYSTEMARGUMENT1];PVOID TlsArray;};struct {UCHAR SuspendApcFill4[KAPC_OFFSET_TO_SYSTEMARGUMENT2];PVOID BBTData;};struct {UCHAR SuspendApcFill5[KAPC_ACTUAL_LENGTH];UCHAR PowerState;ULONG UserTime;};};union {// 线程的恢复操作是通过控制 SuspendSemaphore 信号量的计数来实现的,// 详见 KeResumeThread 等函数。KSEMAPHORE SuspendSemaphore;struct {UCHAR SuspendSemaphorefill[KSEMAPHORE_ACTUAL_LENGTH];// SListFaultCount 记录了在 SListFaultAddress 地址上发生页面错误的次数ULONG SListFaultCount;};};// 线程创建时,挂入到 KPROCESS 的 ThreadListHead 链表中LIST_ENTRY ThreadListEntry;// SListFaultAddress 记录了上一次用户模式互锁单链表 POP 操作发生页面错误的地址PVOID SListFaultAddress;#if defined(_WIN64)LONG64 ReadOperationCount;LONG64 WriteOperationCount;LONG64 OtherOperationCount;LONG64 ReadTransferCount;LONG64 WriteTransferCount;LONG64 OtherTransferCount;#endif} KTHREAD, *PKTHREAD, *PRKTHREAD;
KTHREAD 结构体属性介绍相关推荐
- ETHREAD 结构体属性介绍
typedef struct _ETHREAD {KTHREAD Tcb;// 线程创建时间LARGE_INTEGER CreateTime;union {// 线程退出时间LARGE_INTEGER ...
- KPROCESS 结构体属性介绍
typedef struct _KPROCESS {//// The dispatch header and profile listhead are fairly infrequently// re ...
- Zookeeper C API 基本常量和结构体介绍
Zookeeper 监视(Watches) 简介 Zookeeper C API 的声明和描述在 include/zookeeper.h 中可以找到,另外大部分的 Zookeeper C API 常量 ...
- phpcmsV9 默认主题模板(templates文件目录结构)介绍
phpcmsV9 默认主题模板(templates文件目录结构)介绍 介绍如下: 介绍如下: 这篇文章则详细的介绍一下系统自带默认模板的文件目录结构.主题模板位于"-\phpcms\temp ...
- Ubuntu目录结构简单介绍笔记
一.Ubuntu目录结构简单介绍 Ubuntu目录结构简单介绍 /根目录 1.boot/启动文件.所有与启动有关的文件都保存在这里 ·grub/ Grub引导器相关的文件 2.dev/设备文件 ...
- 下面是html5中新增的结构元素的是,HTML5的新的结构元素介绍
HTML5的新的结构元素介绍 一.HTML5与HTML4的区别 1. 取消了一些过时的HTML4的标签 其中包括纯粹显示效果的标记,如和 ,它们已经被 CSS完全取代. 其他取消的属性:acronym ...
- HTML5的新的结构元素介绍
HTML5的新的结构元素介绍 一.HTML5与HTML4的区别 1. 取消了一些过时的HTML4的标签 其中包括纯粹显示效果的标记,如<font>和<center>,它们已经被 ...
- tomcat的服务器目录在哪个文件夹,Tomcat目录结构详细介绍
打开tomcat的解压之后的目录可以看到如下的目录结构: 1.Tomcat的bin目录: bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以. ...
- 计算机硬件结构简略介绍
前言 计算机硬件结构简略介绍 一.计算机硬件 从软件开发者的角度来看,计算机硬件有三个部件最为关键,分别是中央处理器CPU. 内存.I/O控制芯片 二.早期 早期计算机,CPU的核心频率不高,和内存的 ...
最新文章
- python -- 青少年如何使用 Python 开始游戏开发
- CCNP-2 EIGRP试验2(BSCI)
- 解决css firefox火狐浏览器IE浏览器下的兼容性问题
- ANTLR VS FLEXBISON
- roads 用户体验标准_世界智能大会与ROAD用户体验报告
- 6.10. stack-manager
- 《深入理解Nginx:模块开发与架构解析》一3.3 如何将自己的HTTP模块编译进Nginx...
- 关于Pulsar与Kafka的对比
- Linux 如何限制用户的磁盘使用量 -- quota
- (凭什么断点要放入堆栈?)微机学习:第八课
- Dubbo限流方式源码阅读
- Python数学计算工具1、海伦公式计算三角形面积
- sendcloud php,Sendcloud的x_smtpapi具体如何定义?
- 绿色商业包装材料在行业中的重要地位
- 中小企业信息化(一)——何为信息化
- 小鹅通课程下载(一)
- 动态代理及JDK代理源码解析
- flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子
- 数据采集工具有哪些?数据采集软件有哪些免费下载
- Echarts x轴数据过多 如何处理
热门文章
- idea前进和后退快捷键_必备技能:IDEA一定要懂的32条快捷键
- Py之scikiti -survival:scikiti -survival库的简介、安装、使用方法之详细攻略
- AI公开课:19.02.27周逵(投资人)《AI时代的投资逻辑》课堂笔记以及个人感悟
- 管理信息系统 课程设计(2018-6-16)
- java-Calendar类
- ###STL学习--标准模板库
- Cocoa touch(六):UIViewController
- std::string 用法
- 检查字符串首字母的性能
- 深入理解l内核v4l2框架之video for linux 2(一)