ZHCADC4A September 2011 – March 2014
每个线程都有自己的所有 线程局部变量(甚至包括它未声明或使用的变量)的实例。访问线程局部变量时,应该会访问当前线程的该线程局部变量实例。这意味着线程局部访问需要查找当前线程的 TLS,然后对定义变量的 TLS 块使用偏移以访问变量。
访问 TLS 数据有六种模式,具体取决于是否支持 DLL/DSO(独立链接)、是否支持 dlopen() 以及访问自有数据还是导入数据等因素。表 7-1 总结了 TLS 访问模型的各种特征。
型号 | 通用动态 | 局部动态 | 初始可执行文件 | 局部可执行文件 | 静态可执行文件 | 裸机动态 |
---|---|---|---|---|---|---|
系统有 DLL 或 DSO | 是 | 是 | 是 | 是 | 否 | 是 |
可以访问另一个模块的 TLS 数据 | 是 | 否 | 是 | 否 | 否 | 是 |
从 DLL 或 DSO 进行 TLS 访问 | 是 | 是 | 是 | 否 | 否 | 是 |
从经过 dlopen 处理的模块进行 TLS 访问 | 是 | 是 | 否 | 否 | 否 | 否 |
TLS 初始化的执行者 | 加载器 | 加载器 | 加载器 | 加载器 | 链接器 | 加载器 |
支持弱引用 | 是 | 是 | 否 | 否 | 否 | 否 |
用例 | 访问另一模块的 TLS 数据 | 从 DLL 或 DSO 访问自有的 TLS 数据 | 访问加载时加载的模块的 TLS 数据 | 从可执行文件访问自己的 TLS 数据 | 无 DLL 或 DSO | 访问加载时加载的模块的 TLS 数据 |
部分 | 节 7.5.1.1 | 节 7.5.1.2 | 节 7.5.1.3 | 节 7.5.1.4 | 节 7.5.2 | 节 7.5.3 |
C6x Linux TLS 访问模型需要满足更多约束,而且可能很复杂。它需要符合已经确立的约定。另一方面,静态可执行文件访问模型很简单,只有一个 TLS 块,并且可以使用线程指针相对 (TPR) 寻址来访问任何线程局部变量。有益的做法是,先描述比较复杂的 C6x Linux TLS 模型(节 7.5.1),然后描述静态可执行文件 TLS 模型,作为一种较为简单的情况(节 7.5.2)。最后,描述裸机动态链接情况(节 7.5.3)。