【问题标题】:Set stack for the main thread为主线程设置栈
【发布时间】:2011-10-31 15:52:42
【问题描述】:

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

如果这不可能,我怎样才能至少获得主线程的堆栈地址和大小?

【问题讨论】:

  • 由于 main 线程是由加载程序(shell、init 等)创建的,最有可能是由 forkexecve 创建的,我敢猜测你会做什么希望您必须爬入内核空间...
  • 您能谈谈您为什么要这样做吗?这将有助于我们更好地理解上下文并可能导致更好的答案。
  • aix,这个目的在这里很难解释,但我需要知道我的应用程序中所有线程使用的堆栈。

标签: c linux gcc x86


【解决方案1】:

但是,我还想为我的主线程创建一个自定义堆栈。

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

我怎样才能做到这一点?

您只能通过重置 %sp,%bp 寄存器来切换堆栈。您应该非常小心地执行此操作,最好在退出之前将它们重置。

如果这不可能,我至少要如何获得堆栈地址

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

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

您可以阅读您的应用程序的/proc/pid/maps文件并检查标记为[stack]的地址范围

以及主线程的大小?

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 1970-01-01
      • 2015-11-11
      • 2012-12-12
      • 2019-12-25
      • 2014-09-21
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多