• 1057阅读
  • 1回复

《Windows内核原理与实现》第三章学习笔记---KPROCESS学习 [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-04





[cpp] view plain copy
  1. typedef struct _KPROCESS {  
  2.   
  3.     //  
  4.     // The dispatch header and profile listhead are fairly infrequently  
  5.     // referenced.  
  6.     //  
  7.   
  8.     DISPATCHER_HEADER Header;           //表明KPROCESS也是一个分发器对象(dispatcher object)  
  9.     LIST_ENTRY ProfileListHead;         //用于当该进程参与性能分析时,作为一个节点加入到全局的性能分析进程列表(内核全局变量KiProfileListHead)  
  10.   
  11.     //  
  12.     // The following fields are referenced during context switches.  
  13.     //  
  14.   
  15.     ULONG_PTR DirectoryTableBase[2];    //DirectoryTableBase[0]:指向该进程的页目录表地址;DirectoryTableBase[1]:指向该进程的超空间的页目录表地址  
  16.   
  17. #if defined(_X86_)  
  18.   
  19.     KGDTENTRY LdtDescriptor;            //LDT(局部描述符表)  
  20.     KIDTENTRY Int21Descriptor;          //为了兼容dos,允许他们通过int 21h指令来调用DOS系统功能  
  21.     USHORT IopmOffset;                  //IOPM位置:内核通过IOPM可控制进程的用模式I/O访问权限  
  22.     UCHAR Iopl;                         //I/O优先级  
  23.     BOOLEAN Unused;                      
  24.   
  25. #endif  
  26.   
  27. #if defined(_AMD64_)  
  28.   
  29.     USHORT IopmOffset;  
  30.   
  31. #endif  
  32.   
  33.     volatile KAFFINITY ActiveProcessors;        //记录了当前进程正在哪个处理器上运行,与下面KernelTime,UserTime有关  
  34.   
  35.     //  
  36.     // The following fields are referenced during clock interrupts.  
  37.     //  
  38.   
  39.     ULONG KernelTime;                           //记录了进程对象在内核模式下所花的时间  
  40.     ULONG UserTime;                             //记录了进程对象在用户模式下所花的时间  
  41.   
  42.     //  
  43.     // The following fields are referenced infrequently.  
  44.     //  
  45.       
  46.     LIST_ENTRY ReadyListHead;                   //双向链表的表头,该链表记录了这个进程中处于就绪状态但尚未假如全局就绪链表的线程,请看 注1  
  47.     SINGLE_LIST_ENTRY SwapListEntry;            //单链表,当一个进程被换出(入)内存时,它通过此域加入到全局  
  48.                                                 //变量KiProcessOutSwapListHead(KiProcessInSwapListHead)链表中  
  49. #if defined(_X86_)  
  50.   
  51.     PVOID VdmTrapcHandler;                      //指向处理Ctrl+C中断的函数(VDM 虚拟DOS机)  
  52.   
  53. #else  
  54.   
  55.     PVOID Reserved1;  
  56.   
  57. #endif  
  58.   
  59.     LIST_ENTRY ThreadListHead;                  //此链表包含了该进程的所有当前线程。线程初始化的时候加入到该链表,线程终止的时候从该链表中移出  
  60.     KSPIN_LOCK ProcessLock;                     //自旋锁对象(保护此进程中的数据成员)  
  61.     KAFFINITY Affinity;                         //指定了该进程的线程可以在哪些处理器上运行  
  62.   
  63.     //  
  64.     // N.B. The following bit number definitions must match the following  
  65.     //      bit field.  
  66.     //  
  67.     // N.B. These bits can only be written with interlocked operations.  
  68.     //  
  69.   
  70. #define KPROCESS_AUTO_ALIGNMENT_BIT 0  
  71. #define KPROCESS_DISABLE_BOOST_BIT 1  
  72. #define KPROCESS_DISABLE_QUANTUM_BIT 2  
  73.   
  74.     union {  
  75.         struct {  
  76.             LONG AutoAlignment : 1;             //  
  77.             LONG DisableBoost : 1;              //  
  78.             LONG DisableQuantum : 1;            //  
  79.             LONG ReservedFlags : 29;            //  
  80.         };  
  81.    ↑  
  82.         LONG ProcessFlags;                      //进程中的标志,如上↑↑↑↑  
  83.     };  
  84.   
  85.     SCHAR BasePriority;                         //用于指定一个进程的线程的优先级,所有线程在启动的时候都会继承这个值  
  86.     SCHAR QuantumReset;                         //指定一个进程中线程的基本时限重置值  
  87.     UCHAR State;                                //说明了一个进程是否在内存中,共有六种状态,见注2  
  88.     UCHAR ThreadSeed;                           //用于该进程选择适当的理想处理器  
  89.     UCHAR PowerState;                           //用于记录电源状态  
  90.     UCHAR IdealNode;                            //用于为一个进程选择优先的处理器节点  
  91.     BOOLEAN Visited;                            //WRK中未使用  
  92.     union {  
  93.         KEXECUTE_OPTIONS Flags;  
  94.         UCHAR ExecuteOptions;                   //设置进程内存执行选项  
  95.     };  
  96.   
  97. #if !defined(_X86_) && !defined(_AMD64_)  
  98.   
  99.     PALIGNMENT_EXCEPTION_TABLE AlignmentExceptionTable;  
  100.   
  101. #endif  
  102.   
  103.     ULONG_PTR StackCount;                       //记录了当前进程中有多少个线程的栈位于内存中  
  104.     LIST_ENTRY ProcessListEntry;                //将当前系统中所有具有活动线程的进程串成一个链,表头为KiProcessListHead(仅用在AMD64下)  
  105. } KPROCESS, *PKPROCESS, *PRKPROCESS;  
  106.   
  107.   
  108.   
  109. 注1:LIST_ENTRY ReadyListHead 该链表的意义在于,当一个进程被换出内存以后,它所属的线程一旦就绪,就会挂入这个表中,并要求换入进程;之后  
  110. 当该进程再次换入内存时,ReadyListHead中的所有线程被加入到系统全局就绪线程链表中。ReadyListHead的每一项都指向一个KTHREAD对象的WaitList域  
  111. 的地址,所以从链表中的每一项都能定位到一个线程对象。  
  112.   
  113. 注2:ProcessInMemory、ProcessOutOfMemory、ProcessInTransition、ProcessOutTransition、ProcessInSwap、ProcessOutSwap  
  114.   
  115.   
  116. 总结:KPROCESS对象中记录的信息主要包括两类:一类跟进程内存环境相关,比如与目录表,交换状态等;  
  117. 另一类是与其线程相关的一些属性,比如线程列表以及线程所需要的优先级、时限设置等、  
  118. 系统的总进程列表是在执行体层管理的(EPROCESS结构)  
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个