在pthreads线程的堆栈中预先故障的最佳方法是什么?

bdo*_*lan 6 linux stack memory-management pthreads real-time

我正在为嵌入式Linux系统中运行的实时程序编写代码.因为关键是我们不会在页面错误上无法预测地停止,所以我想在堆栈中预先故障,以便保证我们使用的区域被mlockall()呼叫覆盖.

对于主线程来说这很简单; 只需做几个大alloca()的,并确保每隔几页写一次.这是有效的,因为在程序启动时,堆栈限制远远大于我们需要的数量; 我们最终确定了我们预先确定了多少.

但是,对于pthread堆栈,它们是否也将使用MAP_GROWSDOWN?如果是这样的话,考虑到以下因素是什么是预防它们的最好方法:

  1. 我们不知道libc启动消耗了多少(已知的)堆栈大小
  2. 我们不希望为堆栈分配比必要更多的内存

我知道我可以使用pthread_attr_setstack传递一个手动分配的堆栈,但是这会使线程之后的清理变得复杂,所以如果可能的话我宁愿避免这种情况.

因此,执行此预测的最佳方法是什么?如果有一种简单的方法可以找到堆栈的下限(就在保护页面上方)就足够了; 在这一点上,我可以简单地从那里写入每个页面到当前的堆栈指针.

请注意,可移植性不是问题; 我们很高兴有一个仅适用于x86-32和Linux的解决方案.

Ben*_*son 3

如果您使用,pthread_attr_setstacksize您仍然可以自动分配已知大小。

glibc nptl 在堆栈之间留下保护页,因此您还可以设置一个SEGV处理程序并简单地乱写,直到出现错误,然后longjmp退出循环。那就太丑了!

编辑:一种真正不可移植的方法是打开/proc/self/maps以查找您的堆栈!