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

前端之家收集整理的这篇文章主要介绍了linux – pthreads线程在堆栈中预先故障的最佳方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

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

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

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

最佳答案
如果使用pthread_attr_setstacksize,仍可以使用已知大小进行自动分配.

glibc nptl在栈之间留下了保护页面,所以你也可以设置一个SEGV处理程序,然后简单地涂鸦直到你出错,然后longjmp离开循环.那太丑了!

编辑:一个真正不可移植的方式是打开/ proc / self / maps来找到你的堆栈!

原文链接:https://www.f2er.com/linux/440876.html

猜你在找的Linux相关文章