如果地址空间布局随机化(ASLR)被禁用,我们会有确定性的 mmap 吗?
如果您的应用程序在第 i 个 mmap 时具有完全相同的内存布局(就虚拟地址空间的哪些页面被映射、哪些没有映射而言);那么 mmap 在 Linux 内核中应该是确定性的。
可能会出现一些奇怪的情况,这可能会改变内存布局。例如,附加的命令行参数可以将堆栈移动到较低的地址。有很多文件,在 c 运行时(例如语言环境)中进行了 mmaped,如果某些文件的大小自上次启动以来发生了变化,那么内存布局也会发生变化。甚至堆栈消耗也可能会影响它。
如果您的应用程序通过 malloc 进行的内存分配(大小和分配顺序)发生了变化,则 mmap 将不确定。因此,如果您的应用程序是线程化的;它应该修复 malloc 调用的顺序或将所有 malloc 限制到主线程。
mm/mmap.c: arch_get_unmapped_area - 默认非固定 mmap 地址解析器是确定性的 IIF VMA 树相同并且先前 mmap 的历史记录相同(在mm->free_area_cache调用 mmap 之间有一个处于活动状态的缓存。