• 常用
  • 百度
  • google
  • 站内搜索

游戏资讯

Linux黑科技|mmap实现详解

  • 软件版本:
  • 软件大小:
  • 更新日期:2025-07-06
  • 下载次数:6869
安全下载

详细介绍

故事的开始是这样的,某天在脉脉上看到有人发了下面的帖子:

Linux黑科技|mmap实现详解

mmap 原理

在之前的文章中,我们也介绍过 mmap 的原理,比如这篇:《原来 mmap 这么简单》。当然这篇文章只是简单介绍了 mmap 的原理,但是 mmap 的实现远不止那么简单,这是因为 mmap 涉及多个子系统,如:内存管理、文件系统、中断处理等。

好消息是,这几个子系统我们都有对应的文章介绍过:

  • 内存管理:《Linux虚拟内存空间管理》
  • 文件系统:《 什么是页缓存》
  • 中断处理:《Linux中断处理》

在阅读本文前,最好复习一下上面的文章。

虽然在《原来 mmap 这么简单》一文中,我们简单介绍过 mmap 的原理。但为了方便分析源码,下面还是简单回顾一下 mmap 的原理吧。

mmap 的全称是 memory map,中文意思是 内存映射。其用途是将文件映射到内存中,然后可以通过对映射区的内存进行读写操作,其效果等同于对文件进行读写操作。

下面我们通过一幅图来对 mmap 的原理进行阐述:

Linux黑科技|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);
}

登录后复制

下载地址

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken