c - 为主线程设置栈

标签 c linux gcc x86

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

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

最佳答案

However, I also want to have a custom stack for my main thread.

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

How can I achieve that?

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

If that is not possible, how can I at least get the stack address

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

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

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

and size of the main thread?

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

关于c - 为主线程设置栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956133/

相关文章:

c - 多线程应用程序的数据结构(以及 C 语言的跨平台实现)

c - 如何反转基于表的 CRC16?

linux - 如何使用 SSH 安装 bitnami stack(.run 文件)

linux - Makefile 中的动态目标

c++ - 如何强制 gcc 忽略本地化

服务器可以从不同的进程和套接字发送响应吗?

c++ - 为什么在线编译器会拒绝此 VLA 代码,但本地 Apple clang 不会?

linux - 清理ubuntu服务器上的备份文件

c - C 中的指针整数字符警告

c - 操作系统 : C scripts compile but I'm having a linker error