【问题标题】:How to constrain malloc to a specific region of memory如何将 malloc 约束到特定的内存区域
【发布时间】:2013-05-22 13:50:52
【问题描述】:

有什么:

  • 分配/解除分配/重新分配许多可变大小的对象而不会产生碎片(基本上是malloc 所做的)和
  • 跟踪用于这些分配的所有内存页面,以便我可以
  • 稍后mprotect 将所有这些页面设为只读
  • 最好没有任何锁定 - 所有访问都将是单线程的
  • 在 Linux 和 OS X 上运行,最好在 Windows 上使用等效的东西?

我想不出用标准内存分配函数来做这件事的方法。想到的唯一策略是使用自定义内存池而不是malloc。所以我的问题是:有没有办法在没有自定义 malloc 或(如果没有)关于使用什么的建议的情况下做到这一点?

我可以包装malloc 并轻松跟踪它使用过的所有页面 我如何保证一旦我在这些页面上调用mprotect malloc 不会尝试使用“捕获”的内存在受影响的页面之一中分配块的开始之前还是结束之后?

【问题讨论】:

  • “稍后”是什么意思?进程终止后?您的真正意思是“页”(虚拟内存)还是“帧”(物理内存)?
  • 只需要分配内存吗?或者也解除分配它?你的用例是什么?
  • 正常的 malloc 不起作用,例如因为对于小分配,页面在使用 malloc 分配的多个事物之间共享
  • 如果您将跟踪数据放在扩展的malloc() 分配中:而是包装malloc()free() 等,而不将您的跟踪信息添加到分配的块中。在那里添加您的跟踪信息,在单独的内存空间中创建一个并行跟踪列表。那么您的mprotect() 电话不会影响您的跟踪数据。
  • 您是否正在寻找类似 dmalloc 或 Electric Fence malloc 调试器之类的东西?

标签: c memory-management malloc mprotect


【解决方案1】:

开源Memory Pool System 将在 MPS 本身不接触的操作系统页面大小的块中分配内存。如果您愿意,可以mprotect 这些页面,并确保分配器本身(将其所有数据结构保存在其他地方)或任何其他内存池不会触及它们。如果您使用MVT 池类,您也可以利用inline lockless allocationLinux, Mac OS X, and Windows are supported.

免责声明:我是 MPS 的架构师。

【讨论】:

  • 感谢您的建议,但由于许可证限制,我无法使用它。最后我决定使用免费提供的 malloc 实现之一(dlmalloc)。
  • 祝你好运,但您是否注意到“如果许可条款不适合您(例如,您正在开发闭源商业​​产品或编译器运行时系统),您可以根据 Ravenbrook 的不同条款轻松许可 MPS。”
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多