西工大计算机操作系统课程设计实验报告bh05xh5

 西北工业大学操作系统实验报告

 实验日期: 2013.12.07 实验名称: 查看 WRK进程的等待队列

 一、实验目的了解进程的数据结构,熟悉 WinDbg的用法。

 二、实验要求

 结合 WinDbg的调试功能,分析一个进程的数据结构。

 三、实验过程及结果

 实验步骤:

 1.联机调试界面

 启动 WinDbg 到内核调试模式。

 2.查看一个线程等待的所有同步对象

 1) 在 WRK启动过程中,使用“ !process ”命令查看当前进程。

 图 1

 2) 使用命令“ dt nt!_kthread [ 线程结构入口地址 ] ”查看拥有同步事件对

 象 SynchronizationEvent 的线程。

 - 1-

 图 2

 3) 查看其中的 +0x054 WaitBlockList ,可以看到其等待对象列表头,也就

 是第一个等待对象。使用命令“ dt nt!_kwait_block [ 入口地址 ] ”进入

 第一个等待块查看信息。查询该等待块的 NextWaitBlock ,又看到另一

 个已知的事件对象。

 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) 使用命令“ dt nt!_kwait_block [ 入口地址 ] ”进入第一个等待块查看信

 息。

 图 8

 5) 查看结构 WaitListEntry ,使用命令“ dt nt!_kwait_block [ 入口地址 ] ”

 进入另一个等待块查看信息。

 9

 6) 重复以上步骤, 直到该等待对象的队列遍历完毕, 统计队列中的线程数。

 - 5-

 10

 4.创建线程实验

 通过修改 WRK中的系统文件, wrk 内核创建线程时打印信息。具体步骤

 为:

 1)对 create.c 文件进行修改(文件路径为:/base/ntos/ps/create.c )。

 2)在文件开头适当位置定义两个变量,以分别记录系统线程和应用线

 程的数量:

 int WRK_SysThreadCount;

 int WRK_AppThreadCount;

 3)在 PsCreateSystemThread 函数中添加类似如下信息打印代码:

 DbgPrint( “System thread created, total = %d n”, ++

 WRK_SysThreadCount);

 在 PspCreateThread 函数中添加相应信息打印代码:

 - 6-

 DbgPrint( “Application thread created, total = %d n”, ++

 WRK_AppThreadCount)。

 重新编译 WRK内核 , 放入虚拟机 c:\windows\system32 下并重新加载、

 调试,在 WinDbg中会出现下图所示的类似信息。

 11

 四、实验分析

 WaitBlockList 是等待对象循环队列的列表头, 每一个等待对象都有一个指向下一个对象的 指针 ( NextWaitBlock )。通 过观察线程等 待的 同步 对象QueueObject,查看其中的 WaitListEntry ,可以找到队列中所有等待线程。

 五、所遇问题及解决方法

 本次实验建立在实验一基础上,改变源代码中的程序,然后将编译好的 exe

 文件直接拷入虚拟机运行即可得到结果。

 - 7-

推荐访问:课程设计 操作系统 实验 计算机 报告