我正在考虑一个项目,在该项目中,我将使用在多个进程之间共享的内存映射文件,并且为了能够在所有这些进程*中使用映射区域中的指针值,我需要确保它映射到每个进程中的基地址相同。当然,使用标记MAP_FIXED
to 来做到这一点本身很容易mmap()
,但问题是我应该选择什么地址。
当我的代码开始运行时,我会遇到这样的情况:我的可执行文件及其使用的共享库已经映射到内存中的某个位置。是否可以提前知道这些地址的大致范围?如今,这个问题尤其重要,因为许多内核默认打开了 ASLR。我凭经验看到,似乎有一些松散的地址范围用于主可执行文件,而另一个这样的范围似乎用于共享库,但这些实际上是定义良好的吗?当然,标准文档会很好,但由于所讨论的项目实际上只能由我自己运行,所以松散的设计理念也很好。
如果确实没有办法提前知道预先存在的映射可能会在哪里结束,那么至少有一种方法可以优雅地失败,以防我对有用地址范围的猜测结果是错误的?通常,mmap
会用新请求的映射默默地覆盖先前存在的映射。我想我想要一个类似的标志,如果它覆盖任何东西,O_EXCL
它就会mmap
失败,但我找不到任何与此效果或类似的东西。我想我可以解析/proc/self/maps
并查看是否有任何内容与我的预期映射重叠,但是 eeww。
* 是的,我知道我可以在映射区域中使用相对指针,但出于多种原因我不想这样做。