在 x86-64 架构上,两个寄存器有一个特殊用途:FS 和 GS。在 linux 2.6.* 中,FS 寄存器似乎用于存储线程本地信息。
最佳答案
在 x86-64 中有 3 TLS entries ,其中两个可通过 FS and GS 访问, FS 由 glibc 内部使用(在 IA32 中显然是 FS is used by Wine and GS by glibc )。
Glibc 将其 TLS 入口点指向 struct pthread
它包含一些用于线程的内部结构。 Glibc 通常将 struct pthread
变量称为 pd
,大概是 pthread 描述符。
在 x86-64 上,struct pthread
以 tcbhead_t
开头(这取决于架构,参见宏 TLS_DTV_AT_TP
和 TLS_TCB_AT_TP
)。这个线程控制 block 头,AFAIU,包含一些即使只有一个线程也需要的字段。 DTV 是动态线程向量,包含指向通过 dlopen()
加载的 DSO 的 TLS block 的指针。在 TCB 之前或之后,有一个静态 TLS block ,用于在(程序的)加载时链接的可执行文件和 DSO。 TCB 和 DTV 在 Ulrich Drepper's TLS document 中有很好的解释。 (查找第 3 章中的图表)。
https://stackoverflow.com/questions/6611346/