2011-07-06 9 views
6

64ビットと32ビットのマルチスレッドLinuxプロセスのアドレス空間レイアウトの詳細を知りたい。それを記述する記事へのリンクは高く評価されます。そして、私はそれを直接扱うので、全体の詳細を知る必要があることに注意してください。だから私は、たとえば、スタックスタックの場所、ヒープ、スレッドのプライベートデータなどを知る必要があります。マルチスレッドLinuxプロセスのアドレス空間レイアウト

+0

は、特に私はについての詳細を知りたいSplitStacks機能に無制限であることを積み重ねることができます

mem = mmap (NULL, size, prot, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); 

その部分は書き込み可能である。例えば、私はコードを含むアドレス空間の部分に対処する必要はありません。なぜなら、書き込み可能ではないからです。 – MetallicPriest

+0

スレッドなしのLinuxプロセスの詳細を知っていますか?非スレッドとマルチスレッドの違いは、スタックの数と場所です。 – osgx

答えて

6

スレッドの開始時にスレッドのスタックが割り当てられます。 pthread_attrs)。 TLSデータは、スレッドのスタックの先頭に格納されます。スレッドのスタックのサイズは固定で、通常は2〜8 MBです。スレッドがライブ中に各スレッドのスタックサイズを変更することはできません。 (メインスレッドを実行する最初のスレッドはアドレス空間の最後にメインスタックを使用していますが、このスタックは大きくなり、縮小する可能性があります)。ヒープとコードはすべてのスレッド間で共有されます。 Mutexesはdataセクションのどこにでも置くことができます。それは単なる構造体です。

スレッドのスタックのMMAPは、任意のアドレスに固定されていない:

Glibc sources PS現代GCCは、スレッドが

関連する問題