加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:36:57 所属栏目:Linux 来源:网络整理
导读:我正在为嵌入式Linux系统中运行的实时程序编写代码.因为关键是我们不会在页面错误上无法预测,我想在堆栈中预先保留,以便我们使用的区域保证被mlockall()调用覆盖. 对于主线程来说这很简单;只需做一些大的alloca(),并确保每隔几页写一次.这是有效的,因为在程

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

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

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

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

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读