设置主线程的堆栈

Met*_*est 5 c linux x86 gcc

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

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

osg*_*sgx 7

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

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

我怎样才能做到这一点?

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

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

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

int main()
{
  int a;
  printf("Stackaddress is near %p\n", &a);
}
Run Code Online (Sandbox Code Playgroud)

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

和主线程的大小?

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