堆栈增长如何在 Windows 和 linux 上工作?

Posted

技术标签:

【中文标题】堆栈增长如何在 Windows 和 linux 上工作?【英文标题】:how does stack growing work on windows and linux? 【发布时间】:2011-10-10 07:16:49 【问题描述】:

我刚刚读到 Windows 程序在函数入口调用 _alloca 以增加堆栈,如果它们需要超过 4k 的堆栈。我猜想每次访问保护页面时,windows 都会为堆栈分配一个新页面,因此_alloca 以 4k 步访问堆栈以分配空间。

我还读到这仅适用于 Windows。如果不需要_alloca,linux(或其他ose)如何解决这个问题?

【问题讨论】:

【参考方案1】:

Linux 依赖于高度优化的页面错误处理,因此程序只是将内容压入堆栈,页面错误处理程序将动态扩展堆栈。

【讨论】:

那么堆栈中的孔是否允许?这样做似乎合乎逻辑。 windows使用_alloca的原因是什么? 不,虚拟堆栈没有漏洞。当然,RAM 中的真实页面是分散的。 _alloca 在需要的时候可能会快一点,但是当堆栈足够大时它就被浪费了。 这不是堆栈中的空洞的意思——它意味着两个映射页面之间的未映射页面。

以上是关于堆栈增长如何在 Windows 和 linux 上工作?的主要内容,如果未能解决你的问题,请参考以下文章

大多数现代系统中堆栈增长的方向是啥?

在Linux与Windows上获取当前堆栈信息

谁知道如何查看Windows下正在运行的程序堆栈,Linux可以用gdb,windows下该用啥

我的程序崩溃时如何自动生成堆栈跟踪

在 Windows 上调试 linux 故障转储

编译器如何在堆栈上安排局部变量?