Win32 系统线程信息块(TIB)浅析
2009-03-05 20:02:37 来源:WEB开发网SHOWTIB 程序
为了了解 TIB 在代码中的实现,我写了 SHOWTIB 程序。SHOWTIB 是一个简单的命令行程序,有两个目的,第一个是创建多个线程(有你在命令行指定实际的线性数,例如,“SHOWTIB 5”就是让 SHOWTIB 新创建五个线程并显示这些线程的 TIBs)。第二个目的是所有线程运行起来之后显示每个线程的 TIB 结构数据。我只显示由主线程创建的线程 TIB 数据,不是主线程自己的 TIB 数据。
在显示每个线程的 TIB 时,SHOWTIB 首先显示所有 Win32 操作系统公共的数据域,然后确定当前是运行在 Windows NT 系统中还是 Windows 95 系统中。根据平台系统信息 SHOWTIB 显示相关平台的 TIB 数据域。为了让 TIB 信息显示得连贯和一致,DisplayTIB 函数使用临界区保证代码正常工作。
SHOWTIB.CPP 中有两个有趣的地方,DisplayTIB 函数的开始处,代码使用了几行内联汇编以便在 TIB 18h 偏移处获取数据域并存储到一个指针。偏移 18h 是 TIB 的线性地址。我之所以这么做是我能用常规指针访问其余的 TIB 数据域。还有其它的内联汇编方法和 FS 段改写方法来获取所有数据值。Win32 编译器不会只有一种途径来轻松读取数据段(DS 寄存器)之外的任何段数据的。
第二个有趣的地方是代码 main 函数最后,在创建了所有线程并将对应的线程句柄存储到数组之后,我调用了 WaitForMultipleObjects 函数,传入线程句柄数组。如果我不这样做,主线程可能会在工作线程终止之前从 main 例程返回并调用退出函数 exit。这样将导致显示的 TIBs 数据不完整。
虽然 Windows NT 和 Windows 95 的内核差别很大,但 TIBs 是你能依赖的为数不多的几个共用的数据结构。这不是巧合,因为线程概念是两个操作系统重要的组成部分,所以自然就会某些提供线程专用信息的公共方法。除了 .H 文件之外,TIB 没有在任何正式的文档中描述。但是,它是所有 Win32 规范的重要组成部分,Win32 实现必须遵循它。
本文由 VCKBASE MTT 翻译
更多精彩
赞助商链接