一尘不染

Linux AMD64中如何使用fs / gs寄存器?

linux

在x86-64架构上,两个寄存器具有特殊用途:FS和GS。在linux 2.6。*中,FS寄存器似乎用于存储线程本地信息。

  • 那是对的吗?
  • fs:0中存储了什么?是否有描述此内容的C结构?
  • GS的用途是什么?

阅读 682

收藏
2020-06-02

共1个答案

一尘不染

在x86-64中,有3个TLS条目,其中两个可通过FS和GS访问,FS由glibc内部使用(在IA32中,FS由Wine和GS由glibc使用)。

Glibc使其TLS入口指向,struct pthread其中包含一些用于线程的内部结构。Glibc通常将struct pthread变量引用pdpthread描述符

在x86-64上,struct pthread以a开头tcbhead_t(这取决于体系结构,请参见宏TLS_DTV_AT_TPTLS_TCB_AT_TP)。即使只有一个线程,此线程控制块头AFAIU仍包含一些必填字段。DTV是动态线程向量,并且包含指向通过加载的DSO的TLS块的指针dlopen()。在TCB之前或之后,在(程序)加载时链接了可执行文件和DSO的静态TLS块。Ulrich
Drepper的TLS文档中
对TCB和DTV进行了很好的解释(请参阅第3章中的图)。

2020-06-02