【问题标题】:How to malloc in address range > 4 GiB如何在地址范围 > 4 GiB 中进行 malloc
【发布时间】:2011-03-17 18:45:02
【问题描述】:

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

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

谢谢。

----编辑----

我感兴趣的是作为的地址(uintptr_t) 它的虚拟地址还是物理地址都没有关系,因为,所有 我想要的是地址必须是大于4GiB的

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

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

【问题讨论】:

  • 你怎么知道它没有返回 64 位指针?你做sizeof(void *)检查了吗?
  • malloc() 的全部意义在于它从可用堆中为您提供一块内存,您不必关心它在哪里,当然也不能指定它。除此之外,实际地址在任何情况下都是虚拟地址。

标签: c malloc


【解决方案1】:

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

【讨论】:

  • 好吧,glibc malloc() 为您提供超过 128kB(可调)的分配请求 mmap()。匿名内存不用开/dev/zero,直接把MAP_ANONYMOUS传给mmap()就行了。
【解决方案2】:

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

使用 mmap()。如果你像这样打电话:

mmap(ADDRESS_ABOVE_4GB, 大小, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0)

它会给你你想要的,与 malloc() 的语义几乎相同。

如果您试图在您无法控制/没有源代码(如库代码)中调用 malloc() 时发生这种情况,是的,您必须提供自己的 malloc() 实现就是这样。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不认为这回答了如何强制地址超过 4GiB 的问题。
    • @Jens:好的,是的,重新阅读这个问题有点模棱两可 - 如果 OP 澄清了他到底想要什么,那么如果它不合适或不相关,我将删除我的答案。
    • @jens:我正在使用-m64,我感兴趣的不是指针的size,而是它指向的内存所在的位置,而我希望它在 > 4GiB 的范围内。希望我说清楚了。
    • @vyom:你说的是物理地址> 4 GB还是虚拟地址> 4 GB?请编辑您的问题以使其更清楚。
    【解决方案4】:

    没有强制malloc() 在特定范围内分配地址的标准方法。

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-02-28
        • 2011-08-21
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 2015-08-29
        • 1970-01-01
        • 2020-11-03
        相关资源
        最近更新 更多