但是,我也希望为我的主线程提供一个自定义堆栈.
你不能.主线程的堆栈由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会检测到页面错误看起来像堆栈访问,并会将更多物理页面提供给应用程序的虚拟地址空间.