我目前正在实现一个模拟器来运行32位x86 ELF文件(使用GCC编译),我正在尝试理解TLS(线程本地存储)。
阅读了Ulrich Dreppers关于这个主题的论文,我有以下问题: -
据我所知,%gs:0引用的内存包含TCB(线程控制块)。但是,我无法确切地找到该地址存储的结构。通过我的kernals源代码搜索,我可以找到一些看起来很有前途的结构(tcbhead_t和其他几个),但我知道在我的系统(Ubuntu 2.6.32-41-generic)上存储的偏移量为0x10的值该结构是一个指向__kernal_vsyscall函数的指针,这似乎与我所看到的结构不匹配。
如果有人能指出我缺少的东西,建议一些相关的文档,或者指出源代码的正确区域,我将非常感激。
谢谢,
瑞克。
答案 0 :(得分:1)
我不能代表Linux,但通常TLS存储用于允许每个线程分配特定于线程的任意存储。
我假设你真的只是模仿x86指令(在你精灵加载之后),所以elf在这里并不感兴趣。
在这种情况下,您需要模拟TLS存储。也就是说,对于每个(你必须跟踪这个)模拟线程,你需要跟踪与该线程的GS寄存器相关的单独值。为此,您需要模拟OS线程创建/停止/检查/终止调用以及OS-TLS初始化调用。 (模拟的)线程创建调用将导致模拟VM内部的特定分配空间被分配给该模拟线程的GS寄存器。
一旦你有了这个,模拟GS访问就足够了,因为关于TLS的其他一切都只是在进程空间内运行的常规机器指令。