c - linux 上的 malloc 特定地址或页面(指定一个 "minimum offset")

标签 c linux pointers memory-management luajit

在 Linux 上的 LuaJIT 中,所有虚拟机内存必须低于 2GB 进程内存边界,因为内部指针始终为 32 位。因此我想自己管理更大的分配(使用 FFI 和 malloc 等),例如用于大纹理、音频、缓冲区等。

我现在想确保它们映射到 2GB 边界之上,因为这样它们就不会带走任何 VM 可管理内存。

有什么方法可以mallocmmap(没有映射文件,或者可能在 SHM 中)专门在该地址之上分配一个指针?甚至不必占用 2gig,只需将我的指针映射到更高(=非 32 位)地址

最佳答案

分配一个 2 GB 的 block 。如果它低于限制,则再分配 2 GB(这个必须大于 2 GB,因为只有一个 block 大小可以容纳 2 GB 以下)。

/* Allocates size bytes at an address higher than address */
void *HighMalloc(size_t size, void *address) {
    size_t mysize = (size_t)address;
    void *y, *x;
    if (mysize < size) {
        mysize = size;
    }
    y = x = malloc(mysize);
    if (x < address) {
        /* The memory starts at a low address. 
         * mysize is so big that another block this size cannot fit 
         * at a low address. So let's allocate another block and 
         * then free the block that is using low memory. */
        x = malloc(mysize);
        free(y);
    }
    return x;
}

注意:

如果 size 小于 address,则第二个 malloc 的低地址可能有足够的空间。这就是为什么我在这些情况下增加分配的大小。所以不要用它来分配小内存块。分配一个大块,然后手动将其分成更小的 block 。

关于c - linux 上的 malloc 特定地址或页面(指定一个 "minimum offset"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32601363/

相关文章:

C 数组中第一个索引处的未知访问冲突

c - 返回指针数组

c - 理解 C 结构

c - 我是否要转换 malloc 的结果?

c - 如何正确使用fread()读取指定长度的内容(C语言)

linux - 检查文件是否真的可以在 bash 中打开

linux - svn 合并单个文件。添加新文件

c - 为什么这个汇编程序运行不了?

c - 尝试更新数组元素时出错

c - 有没有更好的方法来比较两个 C 结构?