bdo*_*lan 6 linux stack memory-management pthreads real-time
我正在为嵌入式Linux系统中运行的实时程序编写代码.因为关键是我们不会在页面错误上无法预测地停止,所以我想在堆栈中预先故障,以便保证我们使用的区域被mlockall()呼叫覆盖.
对于主线程来说这很简单; 只需做几个大alloca()的,并确保每隔几页写一次.这是有效的,因为在程序启动时,堆栈限制远远大于我们需要的数量; 我们最终确定了我们预先确定了多少.
但是,对于pthread堆栈,它们是否也将使用MAP_GROWSDOWN?如果是这样的话,考虑到以下因素是什么是预防它们的最好方法:
我知道我可以使用pthread_attr_setstack传递一个手动分配的堆栈,但是这会使线程之后的清理变得复杂,所以如果可能的话我宁愿避免这种情况.
因此,执行此预测的最佳方法是什么?如果有一种简单的方法可以找到堆栈的下限(就在保护页面上方)就足够了; 在这一点上,我可以简单地从那里写入每个页面到当前的堆栈指针.
请注意,可移植性不是问题; 我们很高兴有一个仅适用于x86-32和Linux的解决方案.
如果您使用,pthread_attr_setstacksize您仍然可以自动分配已知大小。
glibc nptl 在堆栈之间留下保护页,因此您还可以设置一个SEGV处理程序并简单地乱写,直到出现错误,然后longjmp退出循环。那就太丑了!
编辑:一种真正不可移植的方法是打开/proc/self/maps以查找您的堆栈!