ubuntu - 线程控制 block (TLS 变体 2?)

标签 ubuntu gcc x86 elf thread-local-storage

我目前正在实现一个模拟器来运行 32 位 x86 ELF 文件(用 GCC 编译),并且我正在尝试了解 TLS(线程本地存储)。

阅读了 Ulrich Dreppers 关于该主题的论文后,我有以下问题:-

据我所知,%gs:0 引用的内存包含一个 TCB(线程控制 block )。但是,我无法准确找到该地址存储的结构是什么。搜索我的 kernals 源代码,我可以找到几个看起来很有希望的结构(tcbhead_t 和其他几个),但我知道在我的系统(Ubuntu 2.6.32-41-generic)上,存储在偏移量 0x10 处的值该结构是指向 __kernal_vsyscall 函数的指针,这似乎与我看到的结构不匹配。

如果有人能指出我所缺少的内容,建议一些相关文档,或者向我指出源代码的正确区域,我将非常感激。

谢谢

瑞克。

最佳答案

我不能代表 Linux,但一般来说,TLS 存储用于允许每个线程分配特定于该线程的任意存储。

我假设您实际上只是模拟 x86 指令(在 elf 加载之后),因此 elf 在这里并不有趣。

在这种情况下,您需要模拟 TLS 存储。也就是说,对于每个(您必须跟踪此)模拟线程,您需要跟踪与该线程的 GS 寄存器关联的单独值。为此,您需要模拟操作系统线程创建/停止/检查/终止调用以及操作系统-TLS 初始化调用。 (模拟的)线程创建调用将导致模拟 VM 内的特定分配空间被分配给该模拟线程的 GS 寄存器。

一旦掌握了这一点,模拟 GS 访问就足够了,因为有关 TLS 的其他所有内容都只是在进程空间内运行的常规机器指令。

关于ubuntu - 线程控制 block (TLS 变体 2?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19160991/

相关文章:

java gksudo 持久海拔

performance - 在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或and?

c - Android gcc sysroot 和链接器

linux - 使用 Assembly 在屏幕上打印字符

C++ SEH - EXCEPTION_DISPOSITION 枚举和 __except() 过滤器表达式之间的相关性

ubuntu - Mac OS 10.7 Server vs Ubuntu for SME Intranet

Selenium 远程 Webdriver 无法与 AWS EC2 一起使用

sql-server - 使用 pyodbc 从 Azure Synapse Notebook 连接到 SQL Server 时出错

linux - 如何激活VIM中高亮显示的C语法?

c - 为什么 sscanf 不填充变量?