一个多线程Linux进程的地址空间布局



我想知道64位和32位多线程Linux进程的地址空间布局的全部细节。链接到任何文章,描述它将是感激。注意,我需要知道所有的细节,而不仅仅是一个概述,因为我将直接处理它。所以我需要知道,例如,线程堆栈位于哪里,堆,线程私有数据等…

线程堆栈在线程启动时分配mmap(甚至在此之前-您可以在pthread_attr s中设置堆栈空间),TLS数据存储在线程堆栈的开头。线程的堆栈大小是固定的,通常是2到8mb。当线程处于活动状态时,每个线程的堆栈大小不能更改。(第一个线程——运行main——仍然在地址空间的末尾使用main堆栈,这个堆栈可以增长和收缩。)堆和代码在所有线程之间共享。互斥锁可以在data节的任何地方-它只是一个结构体。

线程堆栈的mmap不固定在任何地址:

Glibc来源

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

PS现代GCC允许线程堆栈是无限的SplitStacks特性

最新更新