在我们的产品中,我们使用malloc
实现,该实现完全依赖于mmap进行内存分配。我们也合理使用alloca
ing。我们刚刚遇到一个问题,mmap将为堆栈空间分配应该保留的区域(因此当我们的一个较大的alloca溢出到malloc'd区域时会导致非常糟糕的事情发生)。 / p>
我们的进程分配的限制是我们的VM地址空间,而不是物理内存。当进程运行时,我们已经看过/ proc / * / maps文件,看着malloc占用了任何可用的地址空间。它最终会在堆栈rlimit-set范围内分配地址,并最终将一个大的alloca
延伸到其中。
我们试图在启动时通过alloca
我们的整个堆栈限制解决它,但是在各个平台上都没有证明是稳定的(它试图访问我的alloca
内存段错误2.4开发盒,虽然它适用于2.6生产机器。)
有没有办法真正保留地址空间?还有什么可以做的?
答案 0 :(得分:0)
旧版本的心跳确保通过调用memset()ed 1Kb一次到0xff的递归函数来提交堆栈空间。 Heartbeat这样做可以mlock()它可能需要的所有内存。
答案 1 :(得分:0)
这显然是最近记录的特权升级漏洞中使用的安全漏洞。据称,更新的内核版本将被修补。