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

问题描述 投票:0回答:5

我正在尝试在 X86_64 Linux 上做一些测试,我想知道如何 让 malloc() 在高于 4 GiB 的范围内分配返回地址

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

谢谢。

----编辑----

我感兴趣的是作为时的地址(

uintptr_t
) 它的虚拟物理地址并不重要,因为,所有 我想要的是地址必须是大于 4GiB 的

我在 Linux x86_64 上使用

gcc

 (4.2.1) 和 
-m64


(希望我把问题说清楚了)

c malloc
5个回答
5
投票

malloc()

 是错误的工具。你想要 
mmap()
 
/dev/zero
 (这就是 
malloc()
 在现代 
glibc
 幕后所做的事情),IIRC。 (在 Unix 上。我相信 Win32 有一个类似的 API,但我无法告诉你它是什么。)


3
投票

malloc()

 不提供任何方式来询问特定范围内的地址。正如其他一些答案中所述,如果这只是一个测试,您可以继续调用 
malloc()
 来获取越来越多的内存,直到得到您喜欢的答案,但这非常浪费。

使用

mmap()

。如果你这样打电话:

mmap(ADDRESS_ABOVE_4GB, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0)
它会给你你想要的东西,其语义与 malloc() 几乎相同。

如果您试图在您无法控制/没有源代码(例如库代码)中调用

malloc()

 时发生这种情况,是的,您必须提供自己的 
malloc()
 实现以上。


2
投票
只要你用例如编译

gcc -m64 ...

(无论如何可能是默认设置)并确保包含相关标题(即 
<stdlib.h>
malloc
 的情况下),那么一切都应该
正常工作。指针将是 64 位,size_t
 将是 64 位,并且您可以 
malloc
 任意多的内存(无论如何最多 2^64-1 字节,这对任何人来说都足够了......)。


0
投票
没有标准方法可以强制

malloc()

 在特定范围内分配地址。

但是,您可以分配 4 GiB 内存。如果分配的空间足够高地址范围内,则使用该空间。否则,再分配一些空间;它应该分配一个高范围的起始地址,但您应该检查(因为小分配可能仍然挤入低地址范围中剩余的空间),并继续分配,直到分配的空间位于高地址范围中。


0
投票
malloc 返回一个与操作系统内核调用相对应的地址,该调用将找到符合 size_t 要求的“下一个”可用内存块。

如果您想确保地址在特定范围内,自定义版本的 malloc 将无法实现此目的,因为实际的内存分配是从内核分配内存页面到进程的中继。

这基本上意味着剩下的唯一其他技术是继续进行 malloc 直到耗尽低于 4GiB 的内存,或者可能幸运地获得您想要的范围内的地址。请注意,即使要达到该范围,您的程序和操作系统都必须编译为支持 32 位以上的地址,这意味着 64 位架构。

© www.soinside.com 2019 - 2024. All rights reserved.