在 Linux 上的 LuaJIT 中,所有虚拟机内存必须低于 2GB 进程内存边界,因为内部指针始终为 32 位。因此我想自己管理更大的分配(使用 FFI 和 malloc
等),例如用于大纹理、音频、缓冲区等。
我现在想确保它们映射到 2GB 边界之上,因为这样它们就不会带走任何 VM 可管理内存。
有什么方法可以malloc
或 mmap
(没有映射文件,或者可能在 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/