linux – 如何使用克隆系统调用分配新的TLS区域

linux – 如何使用克隆系统调用分配新的TLS区域,第1张

概述问题的简短版本:如果我想为我正在创建的线程分配一个新的TLS区域,我需要将哪个参数传递给x86_64 Linux系统上的克隆系统调用. 长版: 我正在研究一个研究项目,对于我正在尝试的东西,我想使用克隆系统调用而不是使用pthread_create来创建线程.但是,我也希望能够使用线程本地存储.我现在不打算创建多个线程,所以我可以为我使用克隆系统调用创建的每个线程创建一个新的TLS区域. 我正在查 问题的简短版本:如果我想为我正在创建的线程分配一个新的TLS区域,我需要将哪个参数传递给x86_64 Linux系统上的克隆系统调用.

长版:

我正在研究一个研究项目,对于我正在尝试的东西,我想使用克隆系统调用而不是使用pthread_create来创建线程.但是,我也希望能够使用线程本地存储.我现在不打算创建多个线程,所以我可以为我使用克隆系统调用创建的每个线程创建一个新的TLS区域.

我正在查看克隆的手册页,它有关于TLS参数标志的以下信息:

CLONE_SETTLS (since linux 2.5.32)   The newtls argument is the new TLS (Thread Local Storage) descriptor.   (See set_thread_area(2).)

所以我查看了set_thread_area的手册页,注意到以下内容看起来很有希望:

When  set_thread_area()  is  passed  an  entry_number  of -1,it uses a  free TLS entry. If set_thread_area() finds a free TLS entry,the value of u_info->entry_number is set upon return to show which entry was changed.

但是,在尝试了一些之后,似乎我的系统中没有实现set_thread_area(x86_64平台上的Ubunut 10.04).当我运行以下代码时,我收到一条错误消息:set_thread_area()失败:函数未实现

#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <errno.h> #include <sys/syscall.h>#include <sys/types.h>#include <linux/unistd.h> #include <asm/ldt.h>int main(){  struct user_desc u_info;  u_info.entry_number = -1;   int rc = syscall(SYS_set_thread_area,&u_info);  if(rc < 0) {    perror("set_thread_area() Failed");    exit(-1);  }  printf("entry_number is %d",u_info.entry_number);}

我还看到当我使用strace时,看看调用pthread_create时会发生什么,我看不到对set_thread_area的任何调用.我一直在查看nptl pthread源代码,试图了解它们在创建线程时所做的工作.但我还没有完全理解它,我认为它比我正在尝试做的更复杂,因为我不需要在pthread实现中具有强大功能的东西.我假设set_thread_area系统调用是针对x86的,并且x86_64使用了不同的机制.但目前我还没弄清楚它是什么,所以我希望这个问题可以帮助我了解一些我需要了解的内容.

解决方法

I am working on a research project and for something I am experimenting with I want to create threads using the clone system call instead of using pthread_create

在极不可能的情况下,你的新线程永远不会调用任何libc函数(或直接调用其他调用libc的东西;这也包括通过plt的动态符号解析),那么你可以传递你想要的任何TLS存储作为new_tls要克隆的参数.

您应该忽略对set_thread_area的所有引用 – 它们仅适用于32位/ ix86情况.

如果您计划在新创建的线程中使用libc,则应该放弃您的方法:libc期望以某种方式设置TLS,并且在您直接调用clone时无法安排此类设置.当libc发现您没有正确设置TLS时,您的新线程将间歇性地崩溃.调试此类崩溃非常困难,唯一可靠的解决方案是……使用pthread_create.

总结

以上是内存溢出为你收集整理的linux – 如何使用克隆系统调用分配新的TLS区域全部内容,希望文章能够帮你解决linux – 如何使用克隆系统调用分配新的TLS区域所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1018699.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存