Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mmap程序的任何其他部分都不太可能使用的地址_C_Linux_Gcc_X86 64 - Fatal编程技术网

C mmap程序的任何其他部分都不太可能使用的地址

C mmap程序的任何其他部分都不太可能使用的地址,c,linux,gcc,x86-64,C,Linux,Gcc,X86 64,出于某种原因,我想使用固定地址分配一块内存,使用mmap,也就是说,使用MAP\u fixed。所以我想使用一个地址,这个地址不太可能被程序的任何其他部分(堆、堆栈等)使用。任何这样的地址范围都适用于64位系统吗?您可以将mmap映射到一个您需要的区域。这将确保内存区域未被使用。否则,您将得到一个segfault或覆盖程序使用的内容,因为我确信程序映像实际上只有很少的漏洞 Linux将尝试在可执行文件中指定的地址加载ELF可执行文件,该地址可能位于64位地址空间中的任何位置。但是,除非您为链接器

出于某种原因,我想使用固定地址分配一块内存,使用
mmap
,也就是说,使用
MAP\u fixed
。所以我想使用一个地址,这个地址不太可能被程序的任何其他部分(堆、堆栈等)使用。任何这样的地址范围都适用于64位系统吗?

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

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

Linux通常使用
0x00007fff00000000
-
0x00007fffffffffff
范围内的地址作为堆栈,使用
0x00007f0000000000
-
0x00007FFFFFFFFFF
范围内的地址作为共享库。它还为内核保留
0x80000000000000
-
0xffffffffffffff


因此,这意味着堆末端下方和上方的所有内容都可能是自由的,范围
0x0000080000000000
-
0x7fffffffffffffffffffff
。我说可能,因为上面的分配都是默认值,如果您将内核或链接器配置为不同的,则这些默认值是可以更改的。

任何未使用的都可以,只需确保在程序启动时分配即可。还有什么原因需要
MAP\u FIXED
?为什么需要这样做?不,这不是我想要的。我想有一个我事先知道的地址,我可以用它来mmap,而不是像malloc那样只有在运行时才知道的地址。你不能:它实际上并不存在。您的程序映像将有一点堆栈/堆空间,但与您所说的块完全不同。堆栈/堆随机化将使您尝试的内容变得不可能,除非您尝试将一个已知将在cpu上执行的有效负载粘贴在其中。@Magn3s1um您可以使用2^64个地址,因为它是虚拟的,当然尝试这样做可能是不合理的。您可以选择任意高的地址,因为虚拟地址无关紧要,但由于VASR,您不能保证它始终有效。@Magn3s1um:错误。你可以用mmap来做。请参阅mmap文档中的MAP_FIXED。MAP_FIXED仅在您有这些页面时有效。除非在现有页面上进行malloc,否则MAP_FIXED将失败。他担心会覆盖某些内容,需要一块未使用的内存。不会有一块未使用的内存(除了块之间的内部碎片),而且很有可能他会覆盖一些重要的内容,或者写入比页面中可用的数据更多的数据。所以不,他不能只使用任何他想要的地址,即使地图已经修好了。避免0x0000080000000000-0x7FFFFFFFFFFFFFFFFF范围。这些在第一个(据我所知,到目前为止都是如此)x86-64处理器上是无效的,它只使用48位虚拟地址,其他16位用符号扩展来填充。