4

質問の短いバージョン:clone作成しているスレッドに新しい TLS 領域を割り当てたい場合、x86_64 Linux システムのシステム コールに渡す必要があるパラメーターは何ですか。

ロングバージョン

私は研究プロジェクトに取り組んでおり、私が実験していることのためcloneに、を使用する代わりにシステムコールを使用してスレッドを作成したいと考えていますpthread_create。ただし、スレッド ローカル ストレージも使用できるようにしたいと考えています。今のところ多くのスレッドを作成する予定はないので、clone システム コールで作成したスレッドごとに新しい TLS 領域を作成しても問題ありません。

のマニュアルページを見ていましたがclone、TLS パラメータのフラグに関する次の情報が含まれています。

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

だから私はmanページを見て、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() failed: Function not implemented

#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ます。しかし、今のところ、それが何であるかを理解することができなかったので、この質問が、私が何を見る必要があるかについてのアイデアを得るのに役立つことを願っています.

4

2 に答える 2

6

私は研究プロジェクトに取り組んでおり、実験中の何かのために、pthread_create を使用する代わりに clone システムコールを使用してスレッドを作成したいと考えています。

新しいスレッドが libc 関数をまったく呼び出さないという非常にまれなシナリオ(直接、または libc を呼び出す何かを呼び出すことによって。これには PLT による動的シンボル解決も含まれます) では、必要な TLS ストレージを new_tls として渡すことができます。パラメータに.clone

へのすべての参照を無視する必要がありますset_thread_area-- それらは 32 ビット/ix86 ケースにのみ適用されます。

新しく作成したスレッドで libc を使用する予定がある場合、アプローチを放棄する必要がありますlibc 。TLSが特定の方法で設定されることを期待しており、直接呼び出すときにそのような設定を調整する方法はありません。TLS が適切に設定されていないことを が発見すると、clone新しいスレッドが断続的にクラッシュします。libcこのようなクラッシュのデバッグは非常に困難であり、信頼できる唯一の解決策は ... を使用することpthread_createです。

于 2012-04-08T06:32:52.590 に答える