第九章:线程局部存储
PEB,在NT中,该结构可以从进程空间的FS:[0x30]处找到,PEB描述的信息主要包括:进程状态、进程堆、PE映像信息等,其中Ldr记录了进程加载进内存的所有模块的基地址。
TLS技术:
动态线程局部存储技术、静态线程局部存储技术
OS动态申请通过四个API,静态则通过预先在PE文件中声明数据存储空间。
TlsAlloc函数一旦得到一个可用的索引值后,还会遍历进程中的每个线程,并将对应的TLS存储槽全部清0,再返回。
TlsSetValue/TlsGetValue为了速度没有参数验证的错误检查,可以传不是TlsAlloc返回的值作为参数。
TLS存储槽实际对应于TEB中TlsSlot字段,用户可以直接操作此字段
静态线程局部存储预先将变量定义在PE文件内部,一般使用.tls节存储,在Visual C++中只要如下声明
_declspec (thread) int tlsFlag = 1;
静态线程局部存储只有用于静态加载,静态连接到该DLL的其他DLL也要确保不被动态加载。
//动态TLS实例
.