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