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

  • 对吗?
  • 存储在fs:0的是什么?有没有描述这个内容的C struct ?
  • 那么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,其中包含一些用于线程的内部 struct .Glibc通常将struct pthread变量称为pd,大概是pthread descriptor.

在x86-64上,struct pthreadtcbhead_t开头(这取决于体系 struct ,请参见宏TLS_DTV_AT_TPTLS_TCB_AT_TP).这个线程控制块头AFAIU包含一些即使只有一个线程也需要的字段.DTV是动态线程向量,包含指向通过dlopen()加载的DSO的TLS块的指针.在TCB之前或之后,有一个静态TLS块,用于在(程序)加载时链接的可执行文件和DSO.TCB和DTV在Ulrich Drepper's TLS document中有很好的解释(查看第3章中的图表).

Linux相关问答推荐

将UTC字符串日期时间转换为毫秒UTC时间戳

git别名函数可以用单引号写吗?

使用Bash从文件名中删除日期名称

在查找命令中使用 printf

在 Bash 中使用 shell 脚本从文件中解析版本号

为什么 liburing 写入性能低于预期?

如何从 2 个文件中获取内容并使用 shell 脚本将该内容附加到新文件中

Docker 容器立即退出

对一个命令使用不同的 PHP 版本 CLI 可执行文件

内核是如何工作的?

GLIBCXX 版本

如何使用 AWK 合并两个文件?

如何优雅地退出 X11 事件循环?

如何克隆 OpenLDAP 数据库

为 django 项目安装 memcached

使用 ssh 判断远程主机上是否存在文件

Linux:处理成服务

如何通过进程名获取PID?

libaio.so.1:无法打开共享对象文件

编辑文件时保留 samba 共享的文件权限