如何使用系统调用获取 Linux 堆栈的地址边界而不诉诸异常处理程序?我可以使用 getrlimit 获取堆栈大小,但它没有说明堆栈从哪里开始或结束。 RSP 指向堆栈内的某个位置,因此我无法确定已使用多少量或可用量。我可以使用 msync 来查找已提交的内容,但无法查找尚未触及的区域。在我的汇编代码中,我想包含一个检查,以确保我没有在堆栈上推送太多,以至于我可能会接近极限。
答案1
不幸的是,对于 Linux 用户来说,rusage 结构的 ru_isrss 元素未维护。为了获得堆栈使用的近似值,我所采取的解决方法是:
1/ 尽可能靠近程序的开头,声明一个局部变量并全局保留它的地址。
2/ 有一个函数,您可以在需要检查堆栈使用情况时调用该函数,该函数只需声明另一个局部变量并计算其地址与 1/ 中保存的地址之间的差异。
顺便说一句,您可能需要首先检查在您的平台上堆栈是否向上或向下增长。