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