我有几个与 Linux 堆栈大小限制相关的问题。我对 x86_64 系统最感兴趣,但如果存在平台差异,我也想了解它们。我的问题是:
1)Linux如何动态增加堆栈的大小?
我编写了一个带有递归函数(以使用堆栈空间)的测试程序,我可以在其中指定迭代次数作为命令行参数。程序在完成递归后暂停等待用户输入,这使我能够获取有关正在运行的进程的信息。如果我运行少量迭代然后使用pmap
查看堆栈大小为132K。
00007fff0aa3c000 132K rw--- [ stack ]
然而,如果我运行更多的迭代,大小可能会变得更大,我相信默认情况下可达 8192 KB。例如,这是运行更多迭代的输出。
00007fff3ed75000 8040K rw--- [ stack ]
但如果我使用strace
为了在运行应用程序时跟踪系统调用,我没有看到任何与增长堆栈相关的内容。所以我想知道内核正在做什么来管理进程的堆栈空间。
2)Linux在设置时是否以任何方式保护堆栈区域ulimit -s unlimited
?
如果我使用命令ulimit -s unlimited
然后我就可以运行更多的递归函数迭代,并且堆栈会变得更大。例如,这是 pmap 的输出
00007ffda43a3000 8031260K rw--- [ stack ]
因为我不想导致我的机器崩溃/挂起/锁定,所以我还没有测试无限递归。但我想知道我是否做了任何事情会导致内核检测到堆栈溢出。或者 ulimit 是唯一的保护,关闭它可以让堆栈无限增长?
3)如何处理堆栈保护页?
这与我尝试过的任何事情都没有直接关系,但我也想知道 Linux 如何管理堆栈保护页面并允许堆栈动态增长。