【Linux 内核 内存管理】内存管理系统调用 ① ( mmap 创建内存映射 | munmap 删除内存映射 | mprotect 设置虚拟内存区域访问权限 )

2023-03-30 14:30:30 浏览数 (1)

文章目录

  • 一、mmap 创建内存映射
  • 二、munmap 删除内存映射
  • 三、mprotect 设置虚拟内存区域访问权限

一、mmap 创建内存映射


mmap 系统调用函数 , 用于 创建 " 内存映射 " ;

该 " 系统调用 " 函数工作原理如下 :

首先 , 创建 " 匿名内存映射 “ , 将 ” 物理内存页 “ 映射到 进程的 ” 用户虚拟地址空间 " 中 ;

然后 , 将 指定文件 的 指定数据区间 映射到 " 用户虚拟地址空间 " 中 ;

此时 , 可以通过 指针 访问 内存的方式 , 访问文件 ;

mmap 函数原型如下 :

代码语言:javascript复制
#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 系统调用 的作用是 删除内存映射 , 其函数原型如下 :

代码语言:javascript复制
#include <sys/mman.h>
int munmap(void* start,size_t length);

三、mprotect 设置虚拟内存区域访问权限


mprotect 系统调用 的作用是 设置虚拟内存区域访问权限 , 其函数原型如下 :

代码语言:javascript复制
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);

0 人点赞