mmap原理
https://www.cnblogs.com/binlovetech/p/17712761.html
https://yangjie2.github.io/2021/11/14/mmap原理与应用/
基础
物理世界中的实体或者逻辑实体在计算机中都用数据结构来表示,比如一个进程就用一个task_struct
来表示。进程的虚拟内存用一个代表虚拟内存的节点组成的链表来表示,task_struct->mm
就是这个链表的头。比如栈区、文件映射和匿名映射区(mmap
)、堆区、BSS段、data段、text端都是一个链表节点。
阶段一:准备数据结构
- 检查虚拟地址空间,寻找一段连续的空闲地址。
- 申请一个vm_area_struct 初始化并插入
mm
链表中。
阶段二:调用内核空间的mmap函数(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系
建立虚拟内存和磁盘地址的映射,也就是页表的页项有效位标记为0(物理内存不在),将文件对应的磁盘地址填到页表中的磁盘地址项,物理内存地址项为空,这时物理内存中没有任何文件内容。
阶段三:进程访问虚拟内存,引发缺页中断,将文件调入物理内存
进程读或写会触发缺页中断,操作系统根据页表中的磁盘地址将文件内容调入内存,页表项的有效位改为1,地址更换为物理地址。