蒸馏场景:可以处理在mmapped空间的中间插入内存页面吗?
用户空间程序需要数百万页大小的结构(即大多数Linux系统需要4k)。它也需要快速随机访问结构。有时候程序需要在数组中间插入新的结构。订单很重要。
struct { char data[PAGE_SIZE]; } page_sized_t;
size_t N = 1 * 1000 * 1000;
size_t X = INSERT_INDEX;
程序可以实现一个堆分配数组包含指向堆分配结构的指针。插入可以用realloc和memmove来实现。
struct page_sized_t **array = malloc(sizeof(array[0]) * N);
...
array = realloc(array, sizeof(array[0]) * (N+1));
memmove(&array[X+1], &array[X], N-X);
array[X] = malloc(sizeof(array[X][0]));
...
现在我的问题是这样的。实施这样一个程序是否具有一个大的mmap区域内存是可行的。每个结构都放在单页中的地方。然后插入可以这样实现:程序可以让内核在其他人之间插入新页面。基本上,内核负责完成上一段所述的工作。
struct page_sized_t *array = mmap(0, sizeof(array[0]) * N,
PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0);
...
// imaginary syscall: m_insert_map(old_address, old_size, insert_address, insert_size)
array = m_insert_map(array, sizeof(array[0]) * N, sizeof(array[0]) * X, sizeof(array[0]));
...
我认为,目前的系统调用是不可能的。人们只能映射 - 所以在某种程度上只能在最后插入页面。
总结:可以在Linux内核中插入内存页吗?使用这样的接口而不是用户空间实现是否可行?有没有一个系统实现了这个功能?