西北工业大学操作系统实验报告
实验日期: 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-