1

mmap出于某种原因,我想使用固定地址分配一块内存,即使用MAP_FIXED. 所以我想使用一个不太可能被程序的任何其他部分(堆、堆栈等)使用的地址。任何适用于 64 位系统的地址范围?

4

2 回答 2

2

Linux 将尝试在可执行文件中指定的地址加载 ELF 可执行文件,该地址可以是 64 位地址空间中的 ANYWHERE。但是,除非您为链接器提供特殊选项,否则它将构建在低地址加载的可执行文件(通常0x0000000000400000),并合理密集地使用内存(只读和读写部分之间会有间隙),默认堆会立即出现然后。

Linux 通常使用范围内的地址0x00007fff00000000-0x00007fffffffffff用于堆栈和0x00007f0000000000-0x00007ffeffffffff用于共享库。它还为内核保留0x8000000000000000- 0xffffffffffffffff

所以这意味着0x00007f0000000000堆末端以下和以上的所有内容都可能是空闲的,范围0x0000800000000000-也是如此0x7fffffffffffffff。我说可能,因为如果您将内核或链接器配置为不同,上述分配都是可以更改的默认值。

于 2013-07-23T22:03:38.407 回答
0

您可以映射到您 malloc 的区域。这将确保内存区域未被使用。否则,您将得到段错误或覆盖程序使用的内容,因为我确信程序映像实际上只有很少的漏洞。

于 2013-07-23T18:12:09.533 回答