前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux 内核 内存管理】内存管理系统调用 ③ ( mmap 创建内存映射原理 | 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 并分配物理内存页 | mmap 库函数与内核系统调用函数 )

【Linux 内核 内存管理】内存管理系统调用 ③ ( mmap 创建内存映射原理 | 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 并分配物理内存页 | mmap 库函数与内核系统调用函数 )

作者头像
韩曙亮
发布2023-03-30 14:31:05
2.2K0
发布2023-03-30 14:31:05
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 )


1、分配虚拟内存页

分配 虚拟内存页 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ;

此处调用的 mmap 函数是 mmap 库函数 ;

mmap 库函数 :

代码语言:javascript
复制
#include <sys/mman.h>
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);

2、物理地址与虚拟地址进行映射

物理地址与虚拟地址进行映射 : 调用 Linux 内核空间 的 系统调用 mmap 函数 , 实现了 " 物理内存地址 " 与 " 虚拟内存地址 " 的映射关系 ;

Linux 内核中的 mmap 系统调用函数 :

代码语言:javascript
复制
int mmap(struct file *filp, struct vm_area_struct *vma)

3、产生缺页异常并分配物理内存页

缺页异常 : Linux 内核在分配 " 物理内存 “ 时 , 采用了 ” 延迟策略 “ , 即进程第一次访问 , 不会立即分配 物理内存 , 而是产生一个 ” 缺页异常 " ;

分配 物理内存页 : 缺页异常后的

2

种处理策略 ;

  • 文件映射 : 对于 " 文件映射 " , 遇到 " 缺页异常 " 后 , 会 分配 " 物理内存页 “ , 并且将 要映射的文件 的 部分数据 读取到 该 ” 物理内存页 " 中 ;
  • 匿名映射 : 对于 " 匿名映射 " , 直接分配 " 物理内存页 “ , 并且在 " 页表 “ 中 , 将 ” 虚拟内存页 " 映射到 ” 物理内存页 " ;

二、mmap 库函数与 mmap 内核系统调用函数


注意区分下 用户空间 的 mmap 库函数 , 与 内核空间 的 mmap 系统调用函数 ;

mmap 库函数 :

代码语言:javascript
复制
#include <sys/mman.h>
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);

Linux 内核中的 mmap 系统调用函数 :

代码语言:javascript
复制
int mmap(struct file *filp, struct vm_area_struct *vma)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、mmap 创建内存映射原理 ( 分配虚拟内存页 | 物理地址与虚拟地址进行映射 | 产生缺页异常并分配物理内存页 )
    • 1、分配虚拟内存页
      • 2、物理地址与虚拟地址进行映射
        • 3、产生缺页异常并分配物理内存页
        • 二、mmap 库函数与 mmap 内核系统调用函数
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档