2011-07-06 48 views
6

我想知道64位和32位多線程Linux進程的地址空間佈局的詳細信息。鏈接到任何描述它的文章將不勝感激。請注意,我需要了解全部細節,而不僅僅是一個概述,因爲我將直接處理它。所以我需要知道,例如,線程堆棧位於何處,堆,線程私人數據等...多線程Linux進程的地址空間佈局

+0

特別是我想知道的細節部分是可寫的。例如,我不需要處理包含代碼的地址空間部分,因爲它不可寫。 – MetallicPriest

+0

你是否知道無線程linux進程的所有細節,不是嗎?非線程和多線程的區別在於堆棧的數量和位置。 – osgx

回答

6

線程堆棧在線程啓動時分配爲mmap(甚至可以在之前 - 您可以將堆棧空間設置爲pthread_attr s)。 TLS數據存儲在線程堆棧的開始處。線程堆棧的大小是固定的,通常爲2到8 MB。當線程處於活動狀態時,不能更改每個線程的堆棧大小。 (第一個線程 - 運行main - 仍然在地址空間的末尾使用主堆棧,並且此堆棧可能會增大和縮小。)堆和代碼在所有線程之間共享。互斥鎖可以在data節中的任何位置 - 它只是一個結構。

線程堆棧的MMAP不固定在任何地址:

Glibc sources

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

PS現代GCC允許線程堆棧是無限與SplitStacks功能

相關問題