【问题标题】:Address Space Layout for a Multithreaded Linux Process多线程 Linux 进程的地址空间布局
【发布时间】:2011-09-29 12:10:19
【问题描述】:

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

【问题讨论】:

  • 特别想知道可写部分的细节。例如,我不需要处理包含代码的地址空间部分,因为它不可写。
  • 你知道无线程Linux进程的所有细节,不是吗?非线程和多线程的区别在于堆栈的数量和位置。

标签: c linux layout space memory-address


【解决方案1】:

线程堆栈在线程启动时分配mmap(甚至更早 - 您可以在pthread_attrs 中设置堆栈空间)。 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 功能允许线程堆栈不受限制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2011-09-08
    • 2015-11-09
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多