【发布时间】:2011-12-12 22:51:12
【问题描述】:
我试图了解堆栈分配和对齐如何在具有 gcc 的 Linux x86_64 系统上与 pthread 一起工作,以及系统在堆栈上存储了哪些数据。我知道您可以使用pthread_attr_setstack 配置堆栈内存。我在一个执行以下操作的测试程序中完成了这项工作:
1) 递归调用自身并更新分配在堆栈上的未初始化数组
2) 打印出数组第一个元素、最后一个元素和rsp的值
由此我已经能够观察到 rsp 是如何递增的(在我的测试程序中,我注意到编译器内联了一些递归调用)。我还能够看到添加 TLS 内存(带有 __thread 变量)会导致 rsp 的第一个值更低。所以看起来 TLS 变量是分配在栈顶的。
但是,我不确定还有什么。在我看来,堆栈的第一页以某种方式为系统保留,因为我分配的堆栈变量都没有最终在该区域中。即使我不使用任何 __thread 变量,我实例化的变量似乎也不会在第一页中分配(我设置堆栈内存使其与页面对齐)。
所以我的问题是:除了 TLS 数据和堆栈变量之外,pthread 的堆栈上还有什么(如果有的话)?
【问题讨论】: