如果ASLR被禁用,mmap是否确定?

Met*_*est 7 c linux gcc mmap x86-64

如果禁用地址空间布局随机化(ASLR),我们是否会有确定性的mmap?通过确定性,我的意思是如果我使用相同的输入一次又一次地运行相同的应用程序,我将获得mmap返回的相同地址吗?我最感兴趣的是匿名mmaps.

osg*_*sgx 4

如果地址空间布局随机化(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 之间有一个处于活动状态的缓存。