Linux黑科技|mmap实现详解
- 软件版本:
- 软件大小:
- 更新日期:2025-07-06
- 下载次数:6870
详细介绍
故事的开始是这样的,某天在脉脉上看到有人发了下面的帖子:

mmap 原理
在之前的文章中,我们也介绍过 mmap 的原理,比如这篇:《原来 mmap 这么简单》。当然这篇文章只是简单介绍了 mmap 的原理,但是 mmap 的实现远不止那么简单,这是因为 mmap 涉及多个子系统,如:内存管理、文件系统、中断处理等。
好消息是,这几个子系统我们都有对应的文章介绍过:
- 内存管理:《Linux虚拟内存空间管理》
- 文件系统:《 什么是页缓存》
- 中断处理:《Linux中断处理》
在阅读本文前,最好复习一下上面的文章。
虽然在《原来 mmap 这么简单》一文中,我们简单介绍过 mmap 的原理。但为了方便分析源码,下面还是简单回顾一下 mmap 的原理吧。
mmap 的全称是 memory map,中文意思是 内存映射。其用途是将文件映射到内存中,然后可以通过对映射区的内存进行读写操作,其效果等同于对文件进行读写操作。
下面我们通过一幅图来对 mmap 的原理进行阐述:

从上图可以看出,mmap 的原理就是将虚拟内存空间映射到文件的页缓存,在《什么是页缓存》一文中可知,对文件进行读写时需要经过页缓存进行中转的。所以当虚拟内存地址映射到文件的页缓存后,就可以直接通过读写映射区内存来对文件进行读写操作。
mmap 实现
在分析 mmap 的实现前,最好先了解其使用方式,mmap 的使用可以参考《原来 mmap 这么简单》这篇文章。
1. 文件映射
当我们使用 mmap() 系统调用对文件进行映射时,将会触发调用 do_mmap_pgoff() 内核函数来完成工作,我们来看看 do_mmap_pgoff() 函数的实现(经过精简后):
unsigned long
do_mmap_pgoff(struct file *file, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flags, unsigned long pgoff)
{
...
// 1. 获取一个未被使用的虚拟内存区
addr = get_unmapped_area(file, addr, len, pgoff, flags);
if (addr & ~PAGE_MASK)
return addr;
...
// 2. 调用 mmap_region() 函数继续进行映射操作
return mmap_region(file, addr, len, flags, vm_flags, pgoff, accountable);
}
登录后复制