【问题标题】:TIB access in Win32Win32中的TIB访问
【发布时间】:2012-04-15 09:26:51
【问题描述】:

深入了解使用 TIB 的 Win32 API 函数的实现,例如:

  • TLS访问函数:TlsAllocTlsFreeTlsSetValueTlsGetValue
  • GetLastError, SetLastError
  • 消息子系统:GetMessagePeekMessage

通过读取fs:[0x18] 选择器的内容发现他们都访问了TIB(有时称为TEB)。

OTOH 这是不必要的,因为fs 注册直接指向它。根据this article 和我在实践中看到的情况,fs 寄存器保存了 TIB 结构开头的地址,而在偏移量 0x18 处它有指向自身的指针。

间接访问 TIB 的原因是什么?

【问题讨论】:

    标签: c windows winapi x86 memory-segmentation


    【解决方案1】:

    任何使用FS 的指令都需要覆盖,这会在指令中添加一个字节(并且通常需要汇编语言才能使用它)。 FS:18 处的指针(至少在内存服务正确的情况下)是基于 DS 的,因此它可以在没有覆盖的情况下使用,在使用时节省一个字节并且(最重要的是对于许多人来说)可以直接使用来自更高级别的语言,例如 C 或 C++,而不需要汇编语言。

    【讨论】:

    • 现在大多数编译器都有用于访问 FS/GS 段的内在函数(请参阅 MSVC 上的 __readfs*/__readgs*),所以最后一点现在不太适用了。
    • 那么,您说 TIB 包含一个指向自身的指针作为成员是为了允许更短的指令和更高级别的语言?听起来很奇怪……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多