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

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

  • 正确吗?
  • 什么存储在 fs:0 中?是否有任何描述此内容的 C 结构?
  • 那么 GS 有什么用?

最佳答案

在 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 pthreadtcbhead_t 开头(这取决于架构,参见宏 TLS_DTV_AT_TPTLS_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/

相关文章:

linux - 根据日期范围过滤日志文件条目

linux - 使用 find 和 -exec {},有没有办法计算总数?

linux - 对一行的最后一个字段进行排序

linux - 通过 ssh 在远程服务器上执行命令

c - 合并多个 .so 共享库

c++ - 当父进程被杀死时,使用 fork() 创建的子进程是否会自动被杀死?

linux - 如何为 Linux、OS X、Windows 制作 Travis CI 测试包?

linux - 在Linux中使用空格设置环境变量

linux - Linux 的可视化补丁工具

linux - 用于 ssh 的类似 teamviewer 的工具?