如何在地址范围内的malloc> 4 GiB

时间:2011-03-17 18:45:03

标签: c malloc

我正在尝试在X86_64 Linux上进行一些测试,我想知道如何操作 make malloc()分配高于4 GiB的返回地址

我是否必须使用单独的/自定义库覆盖malloc 或者还有其他简单的方法吗?

感谢。

---- ----编辑

我感兴趣的是在uintptr_t)时的地址 它的虚拟物理地址无关紧要,因为全部 我想要的是地址必须是大于4GiB

我在Linux x86_64上使用gcc(4.2.1)和-m64

(希望我明白这个问题)

5 个答案:

答案 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位体系结构。