【发布时间】:2015-09-28 11:16:28
【问题描述】:
我有几个关于 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 如何管理堆栈保护页面以及允许堆栈动态增长。
【问题讨论】:
标签: linux memory-management stack-overflow