c - 多线程 Linux 进程的地址空间布局

标签 c linux layout space memory-address

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

最佳答案

线程堆栈在线程启动时使用 mmap 分配(甚至更早 - 您可以在 pthread_attr 中设置堆栈空间)。 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特征

关于c - 多线程 Linux 进程的地址空间布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594865/

相关文章:

c - 新的 C 学习者。为什么下面的代码不起作用。我得到关于英尺和英寸的错误答案

c - 如何像浏览器一样从 C 中的 URL 下载文件?

linux - Alize LIA_RAL 安装

linux - Haproxy 不使用 rsyslog 记录

android - 设计测试/调试的大纲 View

javascript - 重用 Javascript 函数的最佳实践

c - 在末尾添加节点(C 中的结构节点)

c - Ret2libc 漏洞在 gdb 中有效,但在正常 shell 中会出现错误 sh : 1: g:0:1: not found

python - 在cygwin中安装obspy

在较低的 div 中带有 bg 图像的 HTML CSS 布局