Linux黑科技|mmap实现详解

💡 原文中文,约5900字,阅读约需14分钟。
📝

内容提要

本文介绍了mmap的原理和实现。mmap是将文件映射到内存中,通过对映射区的内存进行读写操作,实现对文件的读写。文章详细介绍了mmap的实现过程,包括获取未使用的虚拟内存区、设置vma结构的各个字段的值、调用文件对象的mmap回调函数来设置vma结构的fault回调函数等。文章还解释了缺页异常的作用,以及mmap是如何将文件映射到虚拟内存中的。

🔎

延伸解读

mmap 的延迟映射机制

文章指出,mmap() 系统调用并不立即将文件映射到虚拟内存,而是设置 vma 的 fault 回调函数。实际映射发生在访问触发缺页异常时,由 do_page_fault() 调用 filemap_fault() 读取文件页缓存并建立页表项。这种延迟映射设计避免了不必要的物理内存占用,也解释了为何 mmap 后首次访问可能较慢。

vma 结构在映射中的核心作用

vma(vm_area_struct)是管理进程虚拟内存区的关键结构,记录起始地址、结束地址、权限、映射文件等信息。mmap_region() 会申请并初始化 vma,将其链接到进程的链表和红黑树中。红黑树用于加速查找,链表则维护所有内存区。理解 vma 有助于分析 mmap 的权限控制和地址空间管理。

缺页异常与文件页缓存的关联

文章强调,虚拟内存不能直接映射磁盘文件,而是通过页缓存中转。缺页异常触发后,__do_fault() 调用 filemap_fault() 从页缓存获取物理页,再生成页表项完成映射。因此,mmap 读写实际作用于页缓存,与普通文件读写共享缓存机制,这影响了数据一致性和性能表现。

❓

Q&A

mmap的主要功能是什么?

mmap的主要功能是将文件映射到内存中,通过对映射区的内存进行读写操作,实现对文件的读写。

mmap的实现过程包括哪些关键步骤?

mmap的实现过程包括获取未使用的虚拟内存区、设置vma结构的字段、调用文件对象的mmap回调函数设置fault回调函数等。

缺页异常在mmap中起什么作用?

缺页异常是将虚拟内存映射到物理内存的关键机制,当访问未映射的虚拟内存时会触发缺页异常。

mmap_region()函数的主要功能是什么?

mmap_region()函数主要用于申请虚拟内存区管理结构并设置各个字段的值,同时将vma结构连接到进程的虚拟内存区链表中。

如何通过mmap实现文件的读写?

通过mmap将文件的页缓存映射到虚拟内存空间,读写映射后的虚拟内存就等同于直接对文件的页缓存进行读写。

mmap()系统调用的工作原理是什么?

mmap()系统调用并不直接映射虚拟内存,而是设置vma的fault回调函数,实际的映射在缺页异常处理时完成。

🏷️

标签

➡️

继续阅读