Linux的TLS(Thread Local Storage)实现由内核和用户两部分模块配合完成的。 内核对TLS需要做的事情是能够让用户态程序(通常是 nptl——一个pthread的实现)在某个时刻能够设置线程唯一的基址值到内核的线程信息结构内。系统调用set_thread_area(x86)和prctl(X86_64)用来完成这个任务。在x86家族中,这些系统调用能够设置fs(x86_64)或者gs(x86)段选择器对应的全局段描述符(gdt)的基址信息。这样线程想访问那些线程唯一的数据的时候,只需要访问fs或者gs段的内容即可,如fs:[0]。这样的好处是使得访问线程本地的数据时候,没有额外的系统调用的消耗,和访问其他用户态数据一样简单。关于段选择器,段描述器,可以参考Intel Software Developers' Manual。
Linux & Windows TLS实现
最新推荐文章于 2022-05-28 11:25:11 发布
本文介绍了Linux和Windows操作系统中实现线程局部存储(TLS)的方法。在Linux中,TLS通过内核和用户态程序配合,利用x86的fs或gs段选择器,以及内核的set_thread_area和prctl系统调用。Windows则使用类似的技术,32位系统中通过fs段实现。而在ARM架构下,Linux通过异常触发系统调用来获取TLS,但也有优化避免系统调用带来的性能损失。
摘要由CSDN通过智能技术生成