我目前正在实现一个模拟器来运行 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/