news 2026/10/5 23:23:14

rmap(no check)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
rmap(no check)

在 Linux 内核的反向映射(Reverse Mapping,rmap)机制中,vma(vm_area_struct)、anon_vma、anon_vma_chain是管理匿名页(Anonymous Page)反向映射的核心结构体,三者分工明确、层层关联——核心目标是解决「快速找到某个匿名页被哪些进程/哪些 VMA 引用」的问题(文件页的反向映射依赖 inode,匿名页则依赖这三者)。

下面从「核心定位→层级关系→数据结构关联→工作流程」四层讲透三者的关系,结合通俗类比和代码级关联逻辑:

一、先明确三者的核心定位(一句话总结)

结构体核心定位类比(便于理解)
vma(VMA)单个进程的「匿名内存区间描述符」(比如进程堆/栈对应的匿名 VMA),是反向映射的「终端节点」某栋楼的「某个房间」(属于特定住户,对应特定内存区间)
anon_vma多个共享同一匿名页的 VMA 的「聚合容器」,是反向映射的「核心枢纽」「小区共享大厅」(连接所有共享同一批匿名页的房间)
anon_vma_chainvma和anon_vma之间的「双向链接桥梁」(因为一个 VMA 可关联多个anon_vma,一个anon_vma可关联多个 VMA)「房间到共享大厅的走廊」(连接房间和大厅,支持一对多/多对一)

二、三者的层级关系与数据结构关联

先看核心数据结构的关键字段(简化版),再解析关联逻辑:

1. 核心字段定义(简化)
// 1. vm_area_struct(VMA):单个进程的匿名内存区间structvm_area_struct{structanon_vma_chain*anon_vma_chain;// 指向该VMA的anon_vma_chain链表头// 其他字段:vm_start/vm_end(地址区间)、vm_flags(权限)等};// 2. anon_vma_chain(链接桥梁):连接VMA和anon_vmastructanon_vma_chain{structvm_area_struct*vma;// 指向所属的VMA(反向关联)structanon_vma*anon_vma;// 指向关联的anon_vma(正向关联)structlist_headsame_vma;// 同一VMA关联多个anon_vma时的链表structlist_headsame_anon_vma;// 同一anon_vma关联多个VMA时的链表};// 3. anon_vma(聚合容器):共享匿名页的VMA集合structanon_vma{structrb_rootrb_root;// 红黑树:存储所有关联的anon_vma_chainstructanon_vma*parent;// 层级父节点(优化fork场景的共享)// 其他字段:引用计数、锁等};// 匿名页的页描述符(关联anon_vma)structpage{structanon_vma*anon_vma;// 指向该匿名页所属的anon_vmaunsignedlongprivate;// 存储swap entry等信息};
2. 核心关联逻辑(可视化)
匿名页(struct page) ↓ (page->anon_vma)指向 anon_vma(共享容器) ↓ (anon_vma->rb_root)挂载多个 anon_vma_chain(链接桥梁) ↓ (anon_vma_chain->vma)指向 且 (anon_vma_chain->anon_vma)反向指向 vma(进程的匿名内存区间) ↓ (vma->anon_vma_chain)挂载多个 anon_vma_chain(同一VMA可关联多个anon_vma)

三、关键场景:为什么需要三者?(fork/写时复制为例)

以fork为例(父子进程共享匿名页,写时复制),理解三者的协作价值:

  1. fork 前:父进程有一个匿名 VMA(堆),对应一批匿名页;
    • 父进程 VMA → anon_vma_chain → 父 anon_vma → 匿名页;
  2. fork 后:子进程创建新的 VMA(复制父进程的匿名区间),但共享匿名页;
    • 子进程 VMA → 新的 anon_vma_chain → 父 anon_vma(复用同一容器)→ 匿名页;
    • 此时:一个 anon_vma 关联两个 anon_vma_chain,对应父子进程的两个 VMA;
  3. 写时复制(COW):子进程写入匿名页时,内核为子进程创建新匿名页,并:
    • 新匿名页关联子进程的新 anon_vma;
    • 子进程 VMA → 新的 anon_vma_chain → 子 anon_vma → 新匿名页;
    • 此时:一个 VMA 可通过多个 anon_vma_chain 关联多个 anon_vma(旧/新匿名页的容器)。
核心价值:
  • 若只有vma和anon_vma:无法处理「一个 VMA 关联多个 anon_vma」(COW 场景)或「一个 anon_vma 关联多个 VMA」(fork 共享场景);
  • anon_vma_chain作为「中间桥梁」,实现了 VMA 和 anon_vma 的多对多关联,是反向映射的「弹性链接」。

四、反向映射的核心工作流程(以匿名页回收为例)

当内核需要回收匿名页(换出到 Swap)时,需找到所有引用该页的进程/VMA,流程如下:

  1. 从page->anon_vma拿到该页的anon_vma容器;
  2. 遍历anon_vma->rb_root中的所有anon_vma_chain;
  3. 从每个anon_vma_chain->vma拿到对应的进程 VMA;
  4. 遍历 VMA 对应的进程页表,清理该匿名页的映射(或标记为 Swap 地址);
  5. 若所有映射都清理完成,释放匿名页(或换出到 Swap)。
关键:三者的分工
  • anon_vma:聚合所有共享该匿名页的 VMA,避免遍历全系统进程;
  • anon_vma_chain:解耦 VMA 和 anon_vma 的多对多关系,适配 fork/COW 场景;
  • vma:最终定位到具体进程的具体内存区间,完成页表清理。

五、核心总结(三者关系的本质)

  1. 层级关系:
    • 匿名页 → anon_vma(容器)→ anon_vma_chain(桥梁)→ vma(终端);
    • vma 和 anon_vma 之间通过 anon_vma_chain 双向链接,支持多对多;
  2. 功能分工:
    • vma:描述「单个进程的匿名内存区间」,是反向映射的「最终目标」;
    • anon_vma:聚合「共享同一批匿名页的所有 VMA」,是反向映射的「查询枢纽」;
    • anon_vma_chain:解决 VMA 和 anon_vma 的「多对多关联」,适配 fork/COW 等动态场景;
  3. 核心目标:
    让内核能快速、高效地找到「某个匿名页被哪些进程的哪些内存区间引用」,从而支撑匿名页的回收、Swap、写时复制等核心功能。

简单类比:

  • 匿名页是「小区里的共享快递柜」;
  • anon_vma是「快递柜所属的小区大厅」;
  • anon_vma_chain是「连接大厅和各住户房间的走廊」;
  • vma是「住户的房间」;
    内核要找「哪个快递柜被哪些住户使用」,需先到大厅(anon_vma),再通过走廊(anon_vma_chain)找到对应的房间(vma)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 16:42:17

ABP框架+Dapper执行原生sql

之前发表一个ABP框架EF执行原生sql,后来自己想了想安装Dapper,用Dapper执行原生sql也可以,并且效率会比EF优一点。 一、首先安装Dapper 有多种方案安装,nuget包安装,或者执行命令 dotnet add package Dapper 二、项…

作者头像 李华
网站建设 2026/10/5 23:27:03

阿里开源Wan2.1-I2V:14B参数视频生成模型完整使用指南

阿里开源Wan2.1-I2V:14B参数视频生成模型完整使用指南 【免费下载链接】Wan2.1-I2V-14B-480P 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.1-I2V-14B-480P 在2025年AI视频生成技术快速发展的背景下,阿里巴巴通义实验室开源了Wan2.…

作者头像 李华
网站建设 2026/10/5 23:27:07

重新定义搜索体验:语义化下拉框改造终极指南

重新定义搜索体验:语义化下拉框改造终极指南 【免费下载链接】bootstrap-select 项目地址: https://gitcode.com/gh_mirrors/boo/bootstrap-select 你是否厌倦了传统下拉框的机械匹配?当用户输入"电子产品"却找不到"手机"选…

作者头像 李华
网站建设 2026/10/5 4:54:19

5步快速上手DataEase:开源BI工具零基础入门指南

5步快速上手DataEase:开源BI工具零基础入门指南 【免费下载链接】DataEase 人人可用的开源 BI 工具 项目地址: https://gitcode.com/feizhiyun/dataease DataEase作为一款开源BI工具,以其直观的可视化分析和拖拽式操作界面,让数据分析…

作者头像 李华
网站建设 2026/10/6 4:33:59

35、Solaris文件与文件I/O详解

Solaris文件与文件I/O详解 1. Solaris中的文件 1.1 文件的基本定义 从广义上讲,文件是一种以字节数组形式存储数据的实体,数据从第0字节开始,一直延伸到文件末尾。文件内容可以有多种形式,如简单的文本文件、二进制可执行文件、目录文件等。Solaris支持多种类型的文件,…

作者头像 李华
网站建设 2026/10/5 14:47:27

42、Unix文件系统UFS实现详解

Unix文件系统UFS实现详解 1. UFS概述 UFS(Unix文件系统)以可加载的文件系统模块形式实现,包含vfs和vnode对象的实例。其中,UFS的vnode接口实现文件操作,而UFS的vfs接口则负责文件系统的管理。 UFS文件系统的实现可分为以下五个主要组件: - vfs对象的实例,以及用于挂…

作者头像 李华