如果ASLR被禁用,mmap是确定性的吗?

如果地址空间布局随机化(ASLR)被禁用,我们是否有确定性的mmap ? 通过确定性,我的意思是说,如果我用相同的input一次又一次地运行相同的应用程序,我会得到相同的地址由mmap返回? 我最感兴趣的是匿名的mmap。

Solutions Collecting From Web of "如果ASLR被禁用,mmap是确定性的吗?"

如果地址空间布局随机化(ASLR)被禁用,我们是否有确定性的mmap?

如果你的应用程序在第i个mmap的时刻具有完全相同的内存布局(根据虚拟地址空间的哪个页面被映射,哪个没有)。 那么mmap在Linux内核中应该是确定性的。

有一些奇怪的情况可能会改变内存布局。 例如,附加的命令行参数可以将堆栈转移到较低的地址。 有很多文件,在c运行时(例如语言环境)进行压缩,如果某些文件的大小从上一次开始更改,内存布局也会改变。 即使堆栈消耗也可能会影响它。

如果通过malloc你的应用程序内存分配(大小和分配顺序)改变,mmap将不是确定性的。 所以,如果你的应用程序是线程的; 它应该修复malloc调用的顺序或者限制所有的malloc到主线程。

mm / mmap.c:arch_get_unmapped_area – 默认的非固定的mmap地址解析器是确定性的IIF VMA树是相同的,并且以前的mmap的历史是相同的(有一个缓存mm->free_area_cache ,在mmap调用之间是活的。

根据我的经验,这是可重复的。 当我有一个确定性的程序(由我写的)(禁用ASLR),我在gdb下运行多次(使用相同的输入和条件),指针是相同的。

然而,作为一个确定性的程序是一个属性不是静态检测(我只是碰巧知道我编码的一些程序是足够确定的)。

内核可能会多次重新映射相同的虚拟内存地址。 但是,我不会依赖内核每次给你相同的地址,因为它不是必需的。 如果您需要一个固定的地址,并且要求内核将其放置在虚拟内存中的特定位置,请使用MAP_FIXED