出于某种原因,我想使用固定地址(即mmap
)使用MAP_FIXED
分配一块内存。所以我想使用一个不太可能被程序的任何其他部分使用的地址(堆,堆栈等)。任何这样的地址范围都适用于64位系统吗?
答案 0 :(得分:2)
Linux将尝试在可执行文件中指定的地址加载ELF可执行文件,该地址可能是64位地址空间中的任何地址。但是,除非您为链接器提供特殊选项,否则它将构建以低地址(通常为0x0000000000400000
)加载的可执行文件,并使用密集合理的内存(只读和读写部分之间会有间隙),之后立即出现默认堆。
Linux通常使用0x00007fff00000000
- 0x00007fffffffffff
范围内的地址作为堆栈,0x00007f0000000000
- 0x00007ffeffffffff
使用共享库。它还为内核保留0x8000000000000000
- 0xffffffffffffffff
。
这意味着低于0x00007f0000000000
且高于堆尾的所有内容都可能是免费的,范围0x0000800000000000
- 0x7fffffffffffffff
也是如此。我说可能,因为如果你将内核或链接器配置为不同,上面的分配都是可更改的默认值。
答案 1 :(得分:0)
您可以mmap到malloc的区域。这将确保未使用内存区域。否则,您将获得段错误或覆盖程序使用的东西,因为我确信程序映像实际上只有很少的漏洞。