有Linux内存API可以在我的地址空间中插入一个块吗?

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

假设我有一个数据结构,并希望一个组件能够增长。有两种选择。要么创建一个链接结构并用指针连接新的内存块,要么我可以分配单个内存块,并在需要时增长。

但是,MMU 可以将块映射到内存中。有没有办法将内存块分配到内存中的特定位置?

我正在寻找的内容大致如下:

constexpr int PAGE = 64*1024*1024;
char* p1 = aligned_alloc(32, PAGE);
char* p2 = aligned_alloc(32, PAGE);
char* temp = allocate_page_at(p1 + PAGE, PAGE);

我意识到在实现这样的事情时,使用现有的例程集释放内存将不再有效,因为指针会不同。所以我并不是说使用 malloc、aligned_alloc 可以做到这一点,它可能是较低级别的,涉及编写一个 API 来分配内存块。

我能想到的实现此目的的一种方法是保留大块地址空间,并控制其中的填充量。比如:

char* p = allocate(size, maxsize);

这将提供成长的能力,而无需管理所有的指针。 Linux 有原语可以实现这一点吗?

linux memory-management
1个回答
0
投票

您可以使用

mmap
在特定地址分配内存。这是 C 语言的示例:

#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    size_t PAGE = 64 * 1024 * 1024;
    char *p1 = mmap(NULL, PAGE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    if (p1 == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }

    char *p2 = mmap(NULL, PAGE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    if (p2 == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }

    char *temp = mmap(p1 + PAGE, PAGE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
    if (temp == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }

    // Use the memory...

    munmap(p1, PAGE);
    munmap(p2, PAGE);
    munmap(temp, PAGE);

    return 0;
}

mmap
MAP_FIXED
允许您指定地址。请小心使用
MAP_FIXED
,因为它可能会覆盖现有映射。

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