在x86-64体系 struct 上,两个寄存器有一个特殊用途:FS和GS.在linux 2.6中.*,FS寄存器似乎用于存储线程本地信息.
- 对吗?
- 存储在fs:0的是什么?有没有描述这个内容的C struct ?
- 那么GS有什么用呢?
在x86-64体系 struct 上,两个寄存器有一个特殊用途: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
,其中包含一些用于线程的内部 struct .Glibc通常将struct pthread
变量称为pd
,大概是pthread descriptor.
在x86-64上,struct pthread
以tcbhead_t
开头(这取决于体系 struct ,请参见宏TLS_DTV_AT_TP
和TLS_TCB_AT_TP
).这个线程控制块头AFAIU包含一些即使只有一个线程也需要的字段.DTV是动态线程向量,包含指向通过dlopen()
加载的DSO的TLS块的指针.在TCB之前或之后,有一个静态TLS块,用于在(程序)加载时链接的可执行文件和DSO.TCB和DTV在Ulrich Drepper's TLS document中有很好的解释(查看第3章中的图表).