设置主线程的堆栈

时间:2011-10-31 15:52:42

标签: c linux gcc x86

出于某种原因,我在调用 pthread_create 之前使用 pthread_attr_setstack 函数为我的应用程序中的所有线程创建自己的堆栈。但是,我也希望为我的主线程提供一个自定义堆栈。我怎样才能做到这一点?

如果不可能,我怎么能至少得到主线程的堆栈地址和大小?

2 个答案:

答案 0 :(得分:7)

  

但是,我也希望为我的主线程提供自定义堆栈。

你做不到。主线程的堆栈由OS elf loader创建。主堆栈的大小不是静态固定的(只有上限,通过ulimit -s)。每次需要时,操作系统都会增加堆栈。

  

我怎样才能实现这一目标?

您只能通过重置%sp,%bp寄存器来切换堆栈。你应该非常小心地这样做,最好在退出之前重新设置它们。

  

如果那是不可能的,我怎么能至少得到堆栈地址

您可以通过以下方式估算堆栈地址:

int main()
{
  int a;
  printf("Stackaddress is near %p\n", &a);
}

您可以阅读申请的/proc/pid/maps文件并查看标有[stack]的地址范围

  

和主线程的大小?

主堆栈的大小不固定。程序启动时,该堆栈几乎为空(包含argv / envp / auxp - 由OS填充);并且每次访问尚未使用的堆栈页面时它都会增长(不缩小)。这是页面错误的一个特例,操作系统会检测到页面错误看起来像堆栈访问,并会将更多的物理页面提供给应用程序的虚拟地址空间。

答案 1 :(得分:2)

由于在完成任何线程特定的初始化之前调用main函数,我认为你不能影响它的堆栈。但是,您可以简单地为main编写一个包装器,它启动一个线程来执行main的常用代码然后只是等待。