深入研究与TIB一起使用的Win32 API函数的实现,例如:
TlsAlloc
,TlsFree
,TlsSetValue
,TlsGetValue
GetLastError
,SetLastError
GetMessage
,PeekMessage
等。人们发现他们所有人都通过读取
fs:[0x18]
选择器的内容来访问TIB(有时称为TEB)。OTOH这是不必要的,因为
fs
寄存器直接指向它。根据this article和我在实践中看到的内容,fs
寄存器将地址保存到TIB结构的开头,而在偏移量0x18处具有指向自身的指针。但是,间接访问TIB的原因可能是什么?
最佳答案
任何使用FS
的指令都需要覆盖,这会在指令上添加一个字节(通常需要汇编语言才能使用它)。 FS:18
上的指针是(至少如果内存可以正确使用的话)是基于DS
的,因此它可以不加覆盖地使用,在使用时保存一个字节,并且(对于许多人来说最重要的是)可以直接从更高级别使用语言,例如C或C++,而不需要汇编语言。
关于c - Win32中的TIB访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9964236/