欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

线程本地存储TLS(Thread Local Storage)的原理和实现——实现探究

线程本地存储TLS(Thread Local Storage)的原理和实现——实现探究

本文为线程本地存储TLS系列之实现探究。
我们在上一篇线程本地存储TLS(Thread Local Storage)的原理和实现——分类和原理中曾经说过TLS可以分为两类:静态TLS和动态TLS。然后又分别说明了两者在程序实现时的用法,并且还说明了windows对这两类TLS的实现原理,我们本文的目的是从底层实现的角度深入探究,深刻理解原理。
先考虑以下两个问题:
1、在上一篇中,我们说到静态TLS数据是在编译时放入.tls节,然后在系统加载程序时,会去寻找.tls节,并且分配一个足够大的内存空间来存放所有这些静态TLS变量。那么问题是,当程序加载后,对静态TLS数据分配的内存空间在哪里呢?用什么来表示呢?
2、在上一篇中,我们说到动态TLS是存放在每一个线程独立的TLS slot数组中,这个数组的大小是TLS_MINIMUM_AVAILABLE维,那么这个数组在哪里呢?TlsSetValue和TlsGetValue应该就是访问的这个数组,在取得索引的情况下,如果我们知道这个数组的位置,那么我们是否完全就能抛开上面两个函数自己读写来测试呢?
一、线程环境块TEB
在给出具体程序之前,我们有必要先讨论一下线程环境块TEB。
我们知道,每个线程都有属于自己的一系列数据,这些数据就是通过TEB来管理,当然就包括像TLS这样的线程私有数据。那么TEB的结构是什么样的呢?在微软的文档和头文件上,我没有查到TEB完整的信息,不过我们还是可以通过Windbg得到的,以下是TEB的详细展开信息:

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功