我想知道64位和32位多线程Linux进程的地址空间布局的完整细节。链接到任何描述它的文章将不胜感激。请注意,我需要了解完整的详细信息,而不仅仅是概述,因为我将直接处理它。所以我需要知道,例如,线程堆栈位于何处,堆,线程私有数据等......
答案 0 :(得分:6)
线程堆栈在线程启动时分配mmap
(甚至在之前 - 您可以在pthread_attr
s中设置堆栈空间)。 TLS数据存储在线程堆栈的开头。线程堆栈的大小是固定的,通常是2到8 MB。线程处于活动状态时,无法更改每个线程的堆栈大小。 (第一个线程 - 运行main - 仍然在地址空间的末尾使用主堆栈,这个堆栈可能会增长和缩小。)堆和代码在所有线程之间共享。互斥体可以在data
部分的任何位置 - 它只是一个结构。
线程堆栈的mmap没有固定在任何地址:
mem = mmap (NULL, size, prot,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
PS现代GCC允许使用SplitStacks功能
来限制线程堆栈