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

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

概述我正在为嵌入式Linux系统中运行的实时程序编写代码.因为关键是我们不会在页面错误上无法预测,我想在堆栈中预先保留,以便我们使用的区域保证被mlockall()调用覆盖.对于主线程来说这很简单;只需做一些大的alloca(),并确保每隔几页写一次.这是有效的,因为在程序启动时,堆栈限制远远大于我们需要的数量;我们最终确定了我们预先确定了多少.但是,对于pth

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

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

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

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

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

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

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

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

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

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

总结

以上是内存溢出为你收集整理的linux – pthreads线程在堆栈中预先故障的最佳方法是什么?全部内容,希望文章能够帮你解决linux – pthreads线程在堆栈中预先故障的最佳方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048587.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存