我的主要问题是我需要启用多个 OS 进程通过映射到所有进程中相同地址范围的大型共享内存堆进行通信。 (为了确保指针值实际上是有意义的。)
现在,我遇到了程序/库的一部分使用标准 malloc/free 的问题,在我看来,底层实现不尊重我使用 mmap 创建的映射。
或者,另一种选择是我在 malloc 已经计划使用的区域中创建映射。
不幸的是,在建立 mmap 映射之前,我无法保证所有进程中的 malloc/free 行为 100% 相同。
这导致我将 MAP_FIXED 标志提供给 mmap。第一个进程使用 0x0 作为基地址,以确保映射范围至少在某种程度上是合理的,但这似乎不会转移到其他进程。 (二进制文件也与 -Wl,-no_pie 链接。)
我试图弄清楚我是否可以通过阅读 malloc_default_zone 来查询系统以了解它计划用于 malloc 的页面,但该 API 似乎没有提供我需要的内容。
有没有办法确保 malloc 不使用特定的内存页/地址范围?
(它需要在 OSX 上运行。Linux 提示,它们指导我朝着正确的方向前进,也很感激。)
最佳答案
我在 mmap
documentation 中注意到了这一点:
但是, malloc
不会使用 map fixed ,所以只要你在 malloc 之前进入,你就可以了:你可以通过首先尝试在没有 MAP_FIXED
的情况下映射一个区域来测试它是否空闲,如果同时成功地址(如果地址空闲,它将执行此操作)然后您可以使用 MAP_FIXED
重新映射,因为您知道您没有选择 malloc
已经抓取的地址空间部分
保证同一块逻辑内存在两个进程中可用的唯一保证方法是从另一个进程中创建一个分支。
但是,如果您使用 64 位指针进行编译,那么您可以只选择一个(不寻常的)内存区域,并希望最好,因为冲突的可能性很小。
另请参阅关于有效地址空间的 this question。