1

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

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

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

如果有人能指出我遗漏的内容,建议一些相关文档,或者指出源代码的正确区域,我将不胜感激。

谢谢,

瑞克。

4

1 回答 1

1

我不能说 Linux,但通常 TLS 存储用于允许每个线程分配特定于线程的任意存储。

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

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

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

于 2013-10-03T14:26:27.190 回答