西工大计算机操作系统课程设计实验报告bh05xh5【可编辑范本】
西北工业大学操作系统实验报告西北工业大学操作系统实验报告 实验日期 2013。12。07 实验名称查看 WRK 进程的等待队列 一、实验目的一、实验目的 了解进程的数据结构,熟悉 WinDbg 的用法。 二、实验要求二、实验要求 结合 WinDbg 的调试功能,分析一个进程的数据结构. 三、实验过程及结果三、实验过程及结果 实验步骤 1.联机调试界面 启动 WinDbg 到内核调试模式。 2.查看一个线程等待的所有同步对象 1) 在 WRK启动过程中,使用“process”命令查看当前进程。 图 1 2) 使用命令“dt nt_kthread [线程结构入口地址]“查看拥有同步事件对 象 SynchronizationEvent 的线程。 -1- 图 2 3) 查看其中的0 x054 WaitBlockList,可以看到其等待对象列表头, 也就是第一个等待对象。使用命令“dt nt_kwait_block[入 口地址]"进入第一个等待块查看信息。查询该等待块的NextWaitB lock,又看到另一个已知的事件对象。 4) 使用命令“dt nt_kwait_block [入口地址]“进入下一个等待块查看信 心. 图 3 5) 重复以上步骤,可以查看线程中全部正在等待的同步对象。可知线程正 在等待的同步对象的队列是循环队列。 -2- 图 4 3.查看某同步对象的所有线程 1) 使用“process”命令查看当前进程。 -3- 图 5 2) 然后观察线程等待的同步对象 QueueObject.使用命令“dt nt_dispatcher_header [入口地址]” 来解释该对象的分发器头. 图 6 3) 查看结构 WaitListHead, 从_LIST_ENTRY 的首尾地址上我们可以看 到,不止一个线程在等待该对象。 因为等待列表头的前向和后向指针指向 的位置不同。 -4- 图 7 4) 使用命令“dtnt_kwait_block [入口地址]”进入第一个等待块查 看信息。 图 8 5) 查看结构 WaitListEntry,使用命令“dtnt _kwait_block [入 口地址]“进入另一个等待块查看信息。 图 9 6) 重复以上步骤,直到该等待对象的队列遍历完毕,统计队列中的线程数。 -5- 图 10 4.创建线程实验 通过修改 WRK 中的系统文件,wrk 内核创建线程时打印信息.具体步骤 为 1对create。c 文件进行修改文件路径为/base/ntos/ps/cre ate.c。 2在文件开头适当位置定义两个变量,以分别记录系统线程和应用线程 的数量 int WRK_SysThreadCount; intWRK_AppThreadCount; 3在 PsCreateSystemThread 函数中添加类似如下信息打印代码 DbgPrint“System threadcreated, total %d\r\ n”, + WRK_SysThreadCount; -6- 4) 在 PspCreateThread 函数中添加相应信息打印代码 DbgPrint“Appli cation t hre ad created, total = d\r\n”,+ WRK_AppThreadCount。 重新编译 WRK 内核, 放入虚拟机c\windows\system32 下并重新加 载、调试,在 WinDbg 中会出现下图所示的类似信息。 图11 四、实验分析四、实验分析 WaitBlockList 是等待对象循环队列的列表头,每一个等待对象都有一个 指向下一个对象的指针( NextWaitBlock) 。通过观察线程等待的同步对象 QueueObject,查看其中的 WaitListEntry,可以找到队列中所有等待线程。 五、所遇问题及解决方法五、所遇问题及解决方法 本次实验建立在实验一基础上,改变源代码中的程序,然后将编译好的 exe 文件直接拷入虚拟机运行即可得到结果。 -7-