出于某种原因,我在调用 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/