mremap()
扩大/缩小现有内存映射,flags参数还可以控制是否需要页对齐
#define_GNU_SOURCE
#include<unistd.h>
#include<sys/mman.h>
void * mremap(void *old_address, size_t old_size , size_t new_size, int flags.../* void *new_address */);
参数
old_address:旧地址已经被page aligned页对齐
old_sixe:VMB虚拟内存块的大小
new_size:mremap操作后需要的VMB大小
flags:默认情况下,没有足够空间expand,mremap()
失败
flag | 描述 |
---|---|
MREMAP_MAYMOVE | 允许内核将映射重定位到新的虚拟地址 |
MREMAP_FIXED(Linux 2.3.31) | 接受第五个参数void * new_address ,该参数指定映射必须移动到页面对齐地址page_align 。在new_address和new_size指定的地址范围内的所有先前映射都不会被映射。如果指定了MREMAP_FIXED,还必须指定MREMAP_MAYMOVE |
new_address:可选择映射地址的位置,也可以NULL
,系统返回映射地址。
返回值
成功,返回一个指向新虚拟内存区域的指针。
失败,返回MAP_FAILED。
mremap() uses the Linux page table scheme.
mremap() changes the mapping between virtual addresses and memory pages.
This can be used to implement a very efficient realloc()
.