文件映射简易图
mmap图解
mmap详解
(一)进程启动映射过程,并且在虚拟内存空间为映射创建虚拟映射区域
1、进程调用库函数mmap
2、在当前进程的虚拟地址空间中寻找一段满足要求的空闲的连续的虚拟地址
3、为这个虚拟地址区分配一个vm_area_struct数据结构,并且对其进行初始化
4、将新建的虚拟区结构插进进程的虚拟地址区域链表或者AVL树中
(二)调用内核mmap函数,实现文件的物理地址和进程的虚拟地址区的一一映射关系
1、通过待映射文件指针,在文件描述表中找到与之对应的文件描述符,再根据文件描述符链接到内核中“已打开文件集”中找到该文件的文件结构体(struct file),这个struct file中维护着和这个已打开文件相关的各项信息
2、通过文件的struct file链接到file_operations模块,调用内核函数mmap
3、内核mmap函数通过虚拟文件系统inode模块定位到文件磁盘的物理地址
4、通过remap_pfn_range建立页表,实现文件物理地址和进程虚拟地址区域的映射关系,但是此时这片虚拟地址并没有任何数据关联到主存
(三)进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到主存的拷贝
1、进程read/write访问虚拟地址空间这一段映射地址,通过查询页表发现这一段并不在物理页面上,从而引发了缺页
2、确认无非法操作之后,内核发起请求调页过程,调页先在交换缓存空间寻找需访问的内存页,如果没有就调用nopage函数,把所缺的页从磁盘中装入主存中,之后进程可以对这片主存进行read/write,如果操作改变了其内容,一定的时间之后,系统会自动会写脏页面到对应的磁盘地址,也即完成了写入到文件的过程
read/write
进程发起read请求,内核查看进程文件描述符表,定位到内核已打开文件集上的文件信息,从而找到此文件的inode,inode在address_space上查找要请求的文件页是否已从缓存在页缓存中,存在则直接返回这片文件页的内容,不存在通过inode定位到文件磁盘地址,将数据从磁盘复制到页缓存,之后再次发起读页面过程进而将页缓存的数据发给用户进程。
mmp优点
1、对文件的读取跨过了页缓存,减少数据拷贝次数,用内存读取取代了I/O读写,提高效率,常规的read/write需要磁盘到页缓存到主存的两次拷贝
2、mmap实现用户内核直接交互,两空间各自修改可以直接反应到映射区域内,从而被对方空间捕捉
3、提供进程间共享内存的方式
4、高效的大规模数据传输,需要磁盘空间代替内存