mmap和munmap函数的用法

在Linux的头文件sys/mman.h中提供了两个用来分配内存的函数:mmap和munmap,函数定义原型如下:

1
2
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *start, size_t length);

mmap说明

返回值:内存映射后返回虚拟内存的首地址。
参数:
start为指定的映射的首地址,该地址应该没有映射过,如果为0则有系统指定位置。
length为映射的空间大小,真正分配空间大小为(length/pagesize+1)。
prot为映射的权限,分为四种未指定(PROT_NONE)、读(PROT_READ)、写(PROT_WRITE)、执行(PROT_EXEC)。如果为PROT_WRITE,则直接可以PROT_READ。
flags:映射方式,分为内存映射和文件映射。内存映射:匿名映射。当值为文件映射是后面两个参数才有效。常用的值有:MAP_ANONYMOUS、MAP_SHARED、MAP_PRIVATE。
fd:映射的文件描述符。
offset为从文件的偏移位置开始映射。

munmap说明

从start位置开始释放length个字节的内存。

应用举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>

main()
{
int *p = mmap(NULL,
getpagesize(),
PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_SHARED,
0,
0);
munmap(p, getpagesize());
}

其中getpagesize()函数的作用为获取一个页的大小,系统默认为4K。