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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核 内存管理内存管理系统调用 ① ( 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);

以上是关于Linux 内核 内存管理内存管理系统调用 ① ( mmap 创建内存映射 | munmap 删除内存映射 | mprotect 设置虚拟内存区域访问权限 )的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理mmap 系统调用源码分析 ① ( mmap 与 mmap2 系统调用 | Linux 内核中的 mmap 系统调用源码 )

Linux 内核 内存管理munmap 系统调用源码分析 ① ( munmap 系统调用函数执行流程 | munmap 函数源码 | vm_munmap 函数源码 )

Linux 内核 内存管理内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

Linux 内核 内存管理Linux 内核内存布局 ① ( 查看 Linux 操作系统位数 | 查看 Linux 操作系统软硬件信息 )

Linux 内核 内存管理伙伴分配器 ① ( 伙伴分配器引入 | 页块阶 | 伙伴 )

Linux 内核 内存管理虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )