2011-07-06 49 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功能

相关问题