Win32 系统线程信息块(TIB)浅析
2009-03-05 20:02:37 来源:WEB开发网00h DWORD pvExcept 域包含一个指针指向线程的结构化异常处理链头。这个链是一个 EXCEPTION_REGISTRATION_RECORD 结构链表(不幸的是这个结构没有在任何正式的 .H 文件中定义)。有关结构化异常处理链的更多信息,请参考我的拙作《Windwos 95 系统编程奥秘》。
04h DWORD pvStackUserTop 域是线程堆栈顶层地址的线性地址。或者说,线程的堆栈指针值将不会大于等于这个域的值。
08h DWORD pvStackUserBase 域是线程用户模式堆栈最低约束页面的线性地址,由于线程使用堆栈中连续的地位地址,那些页面将会被提交,相应地会更新此域。
14h DWORD pvArbitrary 域理论上说,应用程序可以使用此域,它有点像额外的线程局部存储槽,但我从来没有看到过有程序使用过它。
18h DWORD ptibSelf 用来保存 TIB 的线性地址。或者说,TIB 块包括一个自身的指针。为什么要这么做呢?如果要扩展 TIB 结构域的使用,那么就可以使得32位代码用常规指针读写 TIB,而不是用段寄存器操作(例如使用 FS:[xxxxxxxx])。SHOWTIB 程序就使用了这个域。
2Ch DWORD pvTLSArray 域保存线程局部存储(TLS)槽的指针。例如,如果你的 TLS 索引值是 4,你用这个指针上加 10h(4 * sizeof(DWORD)),并直接获取 TLS 值。知道了这个域指向线程的 TLS 槽,你便可以很容易编写自己的 TlsSetValue 和 TlsGetValue。如果在代码中使用 __declspec(thread) 变量,察看一下编译器产生的 ASM 代码。你就会发现它使用了该结构域。
TLS 槽的位置在不用的 Windows 平台上差别很大。Windows NT 中,该域保存一个空指针,直到线程第一次使用 TLS 槽为止,然后系统在默认的进程堆外为 TLS 槽分配内存。(在 Windows NT 中,某个 HeapAlloc 块的缓冲溢出能导致 TLS 数据紊乱 )。在 Windows 95 中,该域总是指向 TLS 槽,作为 Ring3 线程数据库的一部分。
更多精彩
赞助商链接