我正在尝试在X86_64 Linux上进行一些测试,我想知道如何操作 make malloc()分配高于4 GiB的返回地址
我是否必须使用单独的/自定义库覆盖malloc 或者还有其他简单的方法吗?
感谢。
---- ----编辑
我感兴趣的是在值(uintptr_t
)时的地址
它的虚拟或物理地址无关紧要,因为全部
我想要的是地址必须是值大于4GiB
我在Linux x86_64上使用gcc
(4.2.1)和-m64
(希望我明白这个问题)
答案 0 :(得分:4)
malloc()
是错误的工具。您想要mmap()
/dev/zero
(这是malloc()
在现代glibc
)幕后工作中所做的事情,即IIRC。 (在Unix上。我相信Win32有类似的API,但我无法告诉你它是什么。)
答案 1 :(得分:3)
malloc()不会让您以任何方式询问某个范围内的地址。正如在其他一些答案中所描述的那样,如果这只是一个测试,你可以继续调用malloc()来获得越来越多的内存,直到你得到你想要的答案,但这非常浪费。
使用mmap()。如果您打电话给:
mmap(ADDRESS_ABOVE_4GB,尺寸,PROT_READ | PROT_WRITE,MAP_ANONYMOUS,-1,0)
它会给你你想要的东西,与malloc()的语义几乎相同。
如果你试图在代码中对malloc()的调用发生这种情况,你不能控制/拥有源代码,比如库代码,是的,你必须提供自己的malloc()实现做到了这一点。
答案 2 :(得分:2)
只要您使用例如gcc -m64 ...
(可能是默认设置)并确保您包含相关标头(例如<stdlib.h>
的{{1}}),然后一切都正常工作。指针将是64位,malloc
将是64位,你可以size_t
尽可能多的内存(无论如何最多2 ^ 64-1个字节,这对任何人来说应该足够了...... )。
答案 3 :(得分:0)
没有一种标准方法可以强制malloc()
分配特定范围内的地址。
但是,您可以分配4 GiB的内存。如果已分配以便足够的空间位于高地址范围内,请使用该空间。否则,分配更多空间;它应该在高范围内分配一个起始地址,但你应该检查(因为一个小的分配可能仍会挤入低地址范围内的空间),并继续分配,直到分配的空间处于高地址范围。
答案 4 :(得分:0)
malloc返回一个与操作系统内核调用相对应的地址,该调用将找到符合size_t要求的“下一个”可用内存块。
如果你想确保地址在一个特定的范围内,那么malloc的自定义版本将不会起作用,因为实际的内存分配是从内核分配内存页面到进程的中继。
这基本上意味着剩下的唯一技术就是保持malloc'ing直到你耗尽4GiB以下的内存,或者可能会幸运并获得你想要的范围内的地址。请注意,要达到该范围,必须编译程序和操作系统以支持更多的32位地址,这意味着64位体系结构。