13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Mmap内存映射的原理以及实现

面试和工作中可能会用到mmap内存映射,今天就来聊一聊

1、mmap基础概念

mmap 具有如下的特点:

2、mmap内存映射原理

mmap内存映射的实现过程,总的来说可以分为三个阶段:

2.1进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域;

2.2调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系

2.3进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝

3、mmap函数实例分析

3.1mmap函数的原型

void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

参数addr:指定映射的起始地址,通常设为NULL,由内核来分配

参数length:代表将文件中映射到内存的部分的长度。

参数prot:映射区域的保护方式。可以为以下几种方式的组合:

参数flags:映射区的特性标志位,常用的两个选项是:

参数fd:要映射到内存中的文件描述符,有open函数打开文件时返回的值。

参数offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。

函数返回值:实际分配的内存的起始地址

3.2munmap函数

与mmap函数成对使用的是munmap函数,它是用来解除映射的函数;

int munmap(void *start, size_t length)

3.3实例

下面是一个mmap使用的实例代码

//打开文件
fd = open("testdata",O_RDWR);
//创建mmap
start = (char *)mmap(NULL,128,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
//读取文件
strcpy(buf,start);
printf("%s\n",buf);
//写入文件
strcpy(start,"Write to file!\n");
munmap(start,128);
close(fd);

这段代码实现了将测试文件testdata打开,并用mmap函数将文件映射到虚拟内存中,通过指针start对文件进行读写。在终端中可看到由文件读取的数据。程序结束后,可以查看testdata文件,来查看写入的数据


标题名称:Mmap内存映射的原理以及实现
网页链接:http://cdbrznjsb.com/article/dhoipio.html

其他资讯

让你的专属顾问为你服务