news 2026/2/8 14:22:25

rmap(no check)

作者头像

张小明

前端开发工程师

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

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

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

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

结构体核心定位类比(便于理解)
vma(VMA)单个进程的「匿名内存区间描述符」(比如进程堆/栈对应的匿名 VMA),是反向映射的「终端节点」某栋楼的「某个房间」(属于特定住户,对应特定内存区间)
anon_vma多个共享同一匿名页的 VMA 的「聚合容器」,是反向映射的「核心枢纽」「小区共享大厅」(连接所有共享同一批匿名页的房间)
anon_vma_chainvmaanon_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(旧/新匿名页的容器)。
核心价值:
  • 若只有vmaanon_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/2/6 4:11:11

DBeaver插件扩展终极指南:如何用第三方工具提升数据库管理效率

DBeaver插件扩展终极指南:如何用第三方工具提升数据库管理效率 【免费下载链接】dbeaver 项目地址: https://gitcode.com/gh_mirrors/dbe/dbeaver 你是否在为连接特定数据库而烦恼?是否觉得DBeaver的功能无法满足复杂的数据分析需求?…

作者头像 李华
网站建设 2026/2/8 10:53:59

27、Solaris操作系统中的多线程进程架构与内核调度器解析

Solaris操作系统中的多线程进程架构与内核调度器解析 1. 用户级线程执行与LWP的关系 用户级线程的执行依赖于轻量级进程(LWP)或内核线程(kthread),以便被调度执行。线程库中有专门的调度线程负责这部分工作。用户线程有自己的优先级方案和线程库调度器,用于选择下一个要…

作者头像 李华
网站建设 2026/2/7 8:37:38

Avalonia ReactiveUI和DynamicData使用引导

概要Avalonia系列教程每周五持续更新。喜欢本系列视频的观众可在B站或本公众号关注,并且可在评论区表达想看的内容。关注关注Bilibili或本公众号,即可参与不定期会在视频结尾抽奖。https://www.bilibili.com/video/BV1CFJWzuEaG教程中相关的PPT和示例代码…

作者头像 李华
网站建设 2026/2/8 4:05:50

活动预告|AI 开发者日 Day 1:构建人工智能应用

点击蓝字关注我们刚刚落幕的 Microsoft Ignite 与 GitHub Universe 2025 带来了众多关于 AI、开发工具与云平台的重磅更新与全新发布。12 月 16–17 日,微软 Reactor 携手多位来自微软的技术专家,以及微软 MVP,带来 AI 开发者日 系列活动&…

作者头像 李华