文章目录
- 一、mmap 创建内存映射
- 二、munmap 删除内存映射
- 三、mprotect 设置虚拟内存区域访问权限
一、mmap 创建内存映射
mmap
系统调用函数 , 用于 创建 " 内存映射 " ;
该 " 系统调用 " 函数工作原理如下 :
首先 , 创建 " 匿名内存映射 “ , 将 ” 物理内存页 “ 映射到 进程的 ” 用户虚拟地址空间 " 中 ;
然后 , 将 指定文件 的 指定数据区间 映射到 " 用户虚拟地址空间 " 中 ;
此时 , 可以通过 指针 访问 内存的方式 , 访问文件 ;
mmap
函数原型如下 :
#include <sys/mman.h>
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
使用 mmap
系统调用 与 传统文件 操作 对比 :
传统的文件操作 , 首先调用 fopen
函数打开文件 , 然后调用 fread
fwrite
等函数操作文件 , 这些操作 在 用户模式 下调用 , 然后需要 切换到 内核模式 下调用 Linux 内核中相应的文件操作 , 这里 涉及到 用户模式 和 内核模式 之间的 切换 ;
使用 mmap
系统调用 , 避免了 用户模式 与 内核模式 切换的开销 , 提高了文件操作的性能 ;
此外 , 多个进程之间 , 可以使用 mmap
系统调用 创建 共享的 " 文件映射 “ 类型的 ” 内存映射 “ , 进而实现了 ” 共享内存操作 " ;
二、munmap 删除内存映射
munmap
系统调用 的作用是 删除内存映射 , 其函数原型如下 :
#include <sys/mman.h>
int munmap(void* start,size_t length);
三、mprotect 设置虚拟内存区域访问权限
mprotect
系统调用 的作用是 设置虚拟内存区域访问权限 , 其函数原型如下 :
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);