linux mm子系统分析:从mm到hmm的进化
文章平均质量分 86
本专栏聚焦 Linux 内核的HMM异构内存管理。分析mm到 HMM 异构内存管理的进化之路,讲解 HMM 基础架构、内存迁移、页表管理与匿名页处理逻辑。梳理内核源码流程、关键接口与调度原理,剖析异构场景下内存一致性实现,纯内核通用视角,系统吃透 HMM 底层设计思想,助力计算GPU驱动的开发。
余额抵扣
助学金抵扣
还需支付
¥29.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
DeeplyMind
图形领域、AI领域技术开发者,专注于OpenGL/Vulkan图形渲染和AI计算的GPU驱动、GPU硬件开发技术栈和实践。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
专栏目录:Linux 内存管理子系统的进化——从 MM 到 HMM
专栏梳理了Linux内存管理子系统从经典MM到异构内存管理(HMM)的演进历程。内容分为六大部分:首先介绍经典MM基础,包括虚拟地址空间、页表、VMA等核心机制;其次分析MM通用框架如页表遍历、NUMA迁移等;然后探讨设备内存引入的关键技术,如ZONE_DEVICE和dev_pagemap;接着深入解析HMM核心机制及其与DMA的集成;随后通过多个实际驱动案例展示HMM应用;最后讨论大页支持等进阶主题。专栏采用"经典机制→问题→扩展方案"的三段式结构,帮助开发者理解Linux如何通过HMM实现设备内存管理。原创 2026-06-24 05:00:00 · 686 阅读 · 0 评论 -
深度专栏推荐之—linux HMM 实践:从MM到HMM的进化
本文系统梳理了Linux HMM(异构内存管理)的学习路线,从基础到高级分为八个层次: 虚拟内存基础:涵盖页表结构、struct page、PFN、VMA等核心概念 页表遍历框架:重点讲解walk_page_range()和mm_walk_ops 非驻留PTE编码:解析Swap/Migration/Device等特殊PTE格式 MMU Notifier子系统:HMM保持页表一致性的核心机制 ZONE_DEVICE与dev_pagemap:设备内存管理基础设施 页面迁移框架:三阶段迁移流程及锁机制 。原创 2026-03-29 13:31:06 · 765 阅读 · 0 评论 -
0.1 专栏导读:为什么需要从 MM 理解 HMM
本文探讨了GPU计算框架中CPU与GPU内存管理的困境,介绍了Linux内核的HMM(Heterogeneous Memory Management)解决方案。传统显式拷贝模型存在编程复杂、指针失效等问题,而HMM通过共享虚拟地址空间、自动页面迁移等机制实现透明内存管理。文章分析了HMM依赖的Linux内存管理基础设施,包括页表遍历、MMU通知、ZONE_DEVICE等核心组件,并梳理了从经典MM到支持异构设备的进化历程。最后给出了学习HMM的8层知识体系,强调理解底层MM机制是掌握HMM的关键。原创 2026-05-22 05:00:00 · 628 阅读 · 0 评论 -
1.1 虚拟地址空间与 VMA:每个进程的私有世界与划分管理方法
本文深入剖析了Linux内核如何通过VMA(Virtual Memory Area)管理进程的虚拟地址空间。每个进程拥有独立的128TB用户空间,内核将其划分为多个VMA区域,每个VMA代表一段具有相同属性的连续地址区间。关键要点包括: 地址空间结构:通过mm_struct维护,包含代码段、数据段、堆、栈等区域,由maple_tree管理所有VMA。 VMA核心属性: 通过vm_area_struct描述,记录起止地址、权限标志(vm_flags)和映射类型 vm原创 2026-05-21 15:19:17 · 758 阅读 · 0 评论 -
1.2 struct page 与 PFN:VMA 背后的物理存储
Linux内核通过struct page元数据结构管理物理内存页帧,每个4KB页帧对应一个struct page,记录其状态和使用情况。物理页帧编号(PFN)用于索引全局memmap数组,实现虚拟地址到物理内存的映射。struct page包含引用计数、映射状态等关键字段,并通过联合体复用空间以适应不同用途。HMM框架的创新在于让设备内存(如GPU VRAM)也拥有struct page,从而被内核统一管理。这种机制为内存迁移和设备内存整合提供了基础支持。原创 2026-05-22 05:00:00 · 653 阅读 · 0 评论 -
1.3 页表:连接虚拟与物理的桥梁
本文深入解析了x86_64架构的五级页表机制(PGD→P4D→PUD→PMD→PTE),阐述了虚拟地址到物理地址的转换过程。文章首先通过VMA与物理页帧的关系引入页表的核心作用,解释了多级页表的设计必要性——通过树形结构避免为未使用的地址空间分配页表。详细剖析了页表项(PTE)的格式与关键标志位,并演示了内核遍历页表的具体流程。此外还介绍了非驻留页表项的特殊编码方式和大页映射机制,为理解HMM框架中的hmm_range_fault()函数奠定基础。原创 2026-05-25 05:00:00 · 1294 阅读 · 0 评论 -
1.4 缺页(page fault)处理:按需分配的艺术
深入剖析了Linux内核中的缺页异常(Page Fault)处理机制。当程序访问虚拟地址时,若对应物理页不存在,CPU会触发缺页异常。内核通过handle_mm_fault()函数完成以下关键步骤:首先检查地址有效性及权限,然后逐级遍历/分配页表(PGD→P4D→PUD→PMD→PTE),最终分配物理页帧并建立映射。该机制实现了内存的"按需分配",用户程序对此过程完全无感知。文中特别指出HMM框架的hmm_range_fault()复用此机制处理GPU内存访问,并详细分析了缺页处理的代码流程与标志位含义。原创 2026-05-26 05:00:00 · 1123 阅读 · 0 评论 -
1.5 页面回收与交换reclaim/swap:内存不够时怎么办
本文探讨了Linux内核在物理内存不足时的页面回收与交换机制。主要内容包括: 回收策略:内核通过LRU算法维护5条链表区分活跃/非活跃的匿名页和文件页,利用硬件Accessed位追踪页面冷热程度,通过反向映射找到所有页面映射关系。 回收过程:采用优先级控制扫描范围,优先回收文件页(根据swappiness参数调整倾向),处理脏页时文件页回写、匿名页写入swap分区,使用swap entry记录换出页面位置。 极端处理:当回收失败时触发OOM Killer终止进程。原创 2026-05-28 05:00:00 · 826 阅读 · 0 评论 -
2.1 页表遍历框架:walk_page_range() 的设计哲学
Linux页表遍历框架:从重复代码到通用设计 本文剖析了Linux内核如何将页表遍历抽象为通用框架walk_page_range()。核心思路是分离"如何遍历"与"如何处理":框架负责处理页表层级、范围切分、空洞和大页等复杂逻辑,调用者只需通过回调函数定义业务语义。这种设计解决了内核多处重复实现页表遍历的问题,吸收了页表操作的复杂性,使HMM等特性能够复用而非重造轮子。文章从发现问题出发,详细介绍了框架的设计思想、实现机制及其在HMM中的应用价值,展现了Linux内核"一次做好,处处复用"的设计哲学。原创 2026-05-29 05:00:00 · 538 阅读 · 0 评论 -
2.2 NUMA 与页面迁移:把页面搬到正确的地方
本文探讨了Linux内核中页面迁移的核心机制,重点分析了其在NUMA系统中的实现原理。文章首先介绍了NUMA架构下内存访问延迟差异的背景,说明页面迁移的必要性——通过动态调整物理页面位置来优化访问性能。接着详细解析了migrate_pages()函数的调用模型和工作流程,包括迁移模式的选择(异步/同步)、隔离待迁移页面的步骤,以及目标页面的分配策略。文中还阐述了页面迁移的设计目标:保持虚拟地址不变的同时改变物理位置,并列举了多种触发迁移的场景(如系统调用、内存规整、NUMA平衡等)。原创 2026-06-02 05:00:00 · 462 阅读 · 0 评论 -
2.3 MMU Notifier(上):KVM 催生的页表变化通知
探讨了MMU Notifier机制的作用及其在虚拟化等场景中的应用。当CPU页表发生变更(如munmap、页面迁移等操作)时,需要通知拥有"第二套页表"的子系统(如KVM的EPT/NPT、IOMMU、GPU等)失效其映射。MMU Notifier通过订阅-通知机制实现这一功能,核心数据结构包括mmu_notifier订阅对象和回调接口mmu_notifier_ops。当CPU页表修改时,通过mmu_notifier_range描述变更范围,调用订阅者的回调函数进行同步,确保外部MMU与CPU页表一致性。原创 2026-06-02 05:00:00 · 892 阅读 · 0 评论 -
2.4 MMU Notifier(下):mmu_interval_notifier 与序列号协议
本文分析了Linux内核中的mmu_interval_notifier机制,该机制为设备驱动提供了一种高效监控特定虚拟地址区间页表变化的方法。相比传统的全局MMU通知器,它通过区间树和序列号重试机制解决了并发访问问题。文章从HMM/GPU需求出发,详细剖析了核心数据结构、注册/注销流程、失效触发机制以及安全访问协议,并阐述了hmm_range_fault()的标准使用模式。关键创新在于利用区间树缩小通知范围,配合奇偶序列号机制实现无锁并发控制,有效优化了设备页表与CPU页表同步的性能问题。原创 2026-06-03 05:00:00 · 377 阅读 · 0 评论 -
3.1 异构计算的挑战:为什么 MM 需要进化
本文探讨了异构计算环境下传统Linux内存管理(MM)的局限性,并分析了HMM(异构内存管理)的解决方案。文章指出,传统split address space模型导致CPU与设备(如GPU、FPGA)间需要显式数据拷贝,不仅增加编程复杂度,还会造成库生态分裂。理想目标是实现shared address space,使设备能直接访问进程虚拟地址。但硬件现实(如PCIe带宽限制、设备内存特性差异)要求更精细的内存管理。HMM通过两大机制应对挑战:一是地址空间镜像;二是将设备内存纳入CPU的管理。原创 2026-06-03 05:00:00 · 514 阅读 · 0 评论 -
3.2 ZONE_DEVICE:为设备内存创建 struct page
本文分析了Linux内核中ZONE_DEVICE的设计原理及其作用机制。ZONE_DEVICE通过memremap_pages()为设备物理地址范围建立struct page和vmemmap映射,使设备内存能够融入Linux内存管理框架。文章重点探讨了三个问题:1) struct page如何表达设备内存;2) ZONE_DEVICE与普通内存区的区别;3) 不同类型设备内存的语义差异。ZONE_DEVICE的核心是为设备内存提供struct page元数据服务,而非将其纳入buddy分配器管理。原创 2026-06-10 05:00:00 · 633 阅读 · 0 评论 -
3.3 dev_pagemap:设备内存区域的控制面
struct dev_pagemap 是 Linux 内存管理中对设备内存区域的控制结构,作为 ZONE_DEVICE 的管理核心,它主要解决以下问题: 设备内存描述:通过 range/ranges 记录设备物理地址范围,支持单/多段内存区域。 类型与行为控制:type 字段区分内存类型(如私有设备内存、一致性内存、DAX等),ops 提供迁移、释放等回调函数,owner 标识所属驱动实例。 生命周期管理:采用 percpu_ref 引用计数和 completion 机制,确保安全注销时等待所有引用释放。原创 2026-06-08 05:00:00 · 512 阅读 · 0 评论 -
3.4 非驻留 PTE 的新成员:Device Private & Exclusive Entry
分析了Linux内核中HMM(Heterogeneous Memory Management)如何通过Device Private Entry和Device Exclusive Entry两种非驻留PTE编码方式,实现设备内存与CPU页表的协同管理。 关键点: HMM扩展了传统PTE语义,允许not-present PTE携带设备内存状态; 使用swap entry编码空间,通过type区分设备私有/独占类型,offset存储PFN; 引入softleaf抽象层统一处理各类非驻留PTE,解耦具体类型判断。原创 2026-06-12 05:00:00 · 465 阅读 · 0 评论 -
3.5 设备页面迁移:migrate_vma 三阶段操作协议⭐
本文探讨了HMM框架中设备内存迁移的核心机制,重点分析了migrate_vma三阶段API的设计原理与实现。主要内容包括: 设备内存迁移的特殊性:相比传统NUMA迁移,涉及设备私有内存、DMA传输、设备页表同步等复杂场景,需要专门的并发协议。 三阶段API设计: migrate_vma_setup():核心MM负责页表遍历、锁页、解除映射 migrate_vma_pages():迁移页面元数据 migrate_vma_finalize():提交最终PTE状态。原创 2026-06-12 05:00:00 · 473 阅读 · 0 评论 -
4.1 HMM 总览:架构、数据结构与 API 全景⭐
HMM(Heterogeneous Memory Management)是Linux内核中连接CPU与设备内存的核心机制,通过两大功能实现地址空间共享:1)镜像CPU页表到设备侧(hmm_range_fault()),使设备能安全读取进程虚拟地址对应的物理页帧和权限;2)集成设备内存到核心MM框架(ZONE_DEVICE/migrate_vma),支持热数据迁移。HMM不替代设备驱动功能,而是作为"胶水层"协调页表同步(通过mmu_interval_notifier防过期映射)原创 2026-06-16 05:00:00 · 509 阅读 · 0 评论 -
4.2 hmm_range_fault() 逐行解析(上):遍历与 PFN 提取
本文深入分析HMM框架中的hmm_range_fault()函数如何复用walk_page_range()遍历CPU页表,并将页表项转换为PFN编码。文章分为上下篇,上篇聚焦遍历框架与PFN提取机制,主要探讨: 入口协议设计:通过mmu_interval_notifier序列号机制实现受保护的页表快照 核心遍历流程: 复用通用页表遍历框架walk_page_range() 使用last字段实现增量式重试机制 回调表注册:通过mm_walk_ops实现VMA过滤和页表处理 PFN转换逻辑: 正常页表项转为HM原创 2026-06-16 05:00:00 · 692 阅读 · 0 评论 -
4.3 hmm_range_fault() 逐行解析(下):非驻留 PTE 与 fault 策略
本文解析了Linux内核HMM(Heterogeneous Memory Management)机制在处理非驻留页表项时的决策流程,主要内容包括: HMM的两种工作模式:快照模式(只读取当前页表状态)和fault模式(主动触发缺页建立映射) 核心fault决策机制: 单页决策通过hmm_pte_need_fault()判断是否需要触发缺页 整段决策通过hmm_range_need_fault()对多个页的请求进行合并 实际触发缺页通过hmm_vma_fault()完成远程缺页处理。原创 2026-06-18 05:00:00 · 419 阅读 · 0 评论 -
4.4 HMM 与 DMA:从 PFN 到总线地址
本篇分析HMM DMA helper 如何把 PFN 转成设备可访问的总线地址。原创 2026-06-18 05:00:00 · 390 阅读 · 0 评论 -
5.1 test_hmm:内核自测模块的最佳实践
文章摘要: 《test_hmm:Linux内核HMM机制的测试驱动实现》解析了Linux内核中用于测试异构内存管理(HMM)的模拟设备驱动test_hmm。该驱动通过伪设备/dev/hmm_dmirror*模拟GPU等设备的核心行为,包括地址空间镜像(mmu_interval_notifier)、页迁移(migrate_vma)、设备内存管理(ZONE_DEVICE)等关键HMM功能。文章重点分析了其架构设计,包括多设备初始化、核心数据结构(如dmirror、dmirror_device)的作用,以及如何通原创 2026-06-19 05:00:00 · 411 阅读 · 0 评论 -
5.2 drm_gpusvm:DRM 驱动的 HMM 通用封装层
文章摘要(150字): Linux内核的drm_gpusvm模块为GPU共享虚拟内存(SVM)提供了通用框架,通过分层设计整合HMM mirror、MMU notifier和DMA映射功能。其核心采用两级interval tree管理内存区域(大粒度notifier+小粒度range),优化了内存绑定/失效处理效率。关键流程包括:1)按需分块的内存故障处理;2)双路径地址转换(系统页DMA映射/设备页直接映射);3)基于序列号的无效化机制与异步垃圾回收。原创 2026-06-19 05:00:00 · 310 阅读 · 0 评论 -
5.3 Intel Xe:基于 HMM 的 GPU 共享虚拟内存与页面迁移
分析Intel Xe GPU驱动中共享虚拟内存(SVM)的实现架构。Xe SVM通过分层设计整合了GPU page fault处理、VRAM设备私有页面管理、TLB失效、多tile同步和垃圾回收(GC)等功能。关键点包括:(1)用户态通过fault-mode VM和CPU_ADDR_MIRROR标记共享地址空间;(2)硬件fault事件经队列分发,由worker线程处理;(3)核心流程包含ASID/VMA查找、HMM页面获取、VRAM迁移决策和GPU页表更新;(4)CPU端无效化通过PTE清除和TLB刷新。原创 2026-06-20 05:00:00 · 540 阅读 · 0 评论 -
5.4 AMD KFD SVM:完整的双向迁移实现
AMD KFD SVM技术通过统一管理器实现了CPU与GPU显存的双向迁移、故障恢复和多GPU访问策略。该技术采用属性驱动模型,通过ioctl接口设置首选位置、访问权限等属性触发迁移操作。核心结构svm_range管理内存范围,dev_pagemap处理设备私有页。迁移过程分为RAM→VRAM(使用migrate_vma和SDMA拷贝)和VRAM→RAM(通过pgmap回调)两个方向。GPU故障恢复时根据最佳位置策略迁移数据并重建映射。原创 2026-06-20 05:00:00 · 387 阅读 · 0 评论 -
5.5 amdgpu HMM:userptr BO 的页表同步
本文介绍了AMDGPU驱动中userptr BO的实现机制,其核心思路是将用户态CPU内存包装为GEM/TTM BO对象,通过HMM机制同步CPU页表到GPU页表。主要内容包括:1) userptr BO与SVM的区别,前者侧重于页表同步而非迁移;2) BO创建流程,包括UAPI接口和HMM notifier注册;3) notifier回调处理,GFX和KFD采用不同失效策略;4) 页获取与绑定过程,通过HMM获取页并转换为GPU可访问形式;5) 命令提交时的页表验证机制;6) KFD特有的恢复工作队列机制原创 2026-06-19 05:00:00 · 284 阅读 · 0 评论 -
6.1 大页与 HMM:THP 和 HugeTLB 的处理
本文摘要(149字): 大页技术通过减少页表条目和TLB缺失提升性能。Linux支持三种大页:THP(透明2MiB页)、HugeTLB(可配置预留页)和PUD级1GiB页。HMM框架输出base-page PFN数组并携带order信息,驱动可据此优化设备页表。关键实现包括:PMD/PUD页表项解析、迁移时的compound处理、基于mmu_notifier的并发控制。不同大页类型适用于不同场景,THP对应用透明,HugeTLB保证分配成功,PUD页适合AI大模型。驱动需检查HMM_PFN_ORDER以识别原创 2026-06-27 10:20:41 · 614 阅读 · 0 评论 -
6.2 HMM 与其他子系统的交互
本文总结了HMM(异构内存管理)与Linux内存管理子系统的核心交互机制。HMM作为MM的扩展接口,复用fault、rmap、migration等现有机制,使设备页表融入Linux内存语义。关键点包括:通过hmm_range_fault()触发远程缺页处理,遵循memcg记账规则;与userfaultfd协作时需识别标记;利用MMU notifier实现并发控制;设备需自行处理TLB失效;通过rmap和migration entry协调页迁移。原创 2026-06-27 11:03:10 · 233 阅读 · 0 评论 -
6.4 专栏总结:从 MM 到 HMM 的设计哲学
Linux 通过 HMM(异构内存管理)机制将原本为 CPU DRAM 设计的内存管理(MM)扩展到了 GPU/CXL/SmartNIC 等异构设备内存。其核心思想是复用而非重构,将设备内存接入 Linux MM 现有的对象模型(如 mm_struct、struct page)、页表模型、缺页处理模型、通知模型和迁移模型。原创 2026-06-26 15:46:05 · 434 阅读 · 0 评论 -
附录 A:mm→hmm进化专栏术语表
本文档是Linux内存管理(MM)和异构内存管理(HMM)的术语速查表,主要包含四部分内容:1)地址空间与VMA,解释虚拟地址、物理地址等概念;2)page、folio与PFN,介绍内存页管理相关术语;3)页表与PTE编码,说明页表结构和特殊PTE类型;4)缺页、回收与迁移,涵盖内存异常处理和页面管理机制。文档可作为阅读MM/HMM专栏时的快速参考工具,特别建议在理解HMM、迁移等章节时重点查阅相关术语。原创 2026-05-23 22:07:44 · 651 阅读 · 0 评论 -
struct page / folio的详细实现分析
本文分析了Linux内核中的struct page和struct folio结构体设计。struct page是内核管理物理页面的基础数据结构,采用联合体设计支持不同用途,但存在语义模糊和字段膨胀问题。5.16版本引入的struct folio通过类型约束和扩展元数据解决了这些问题:保证始终指向复合页首页,并利用尾页空间存储大页特有元数据。文章详细解析了两个结构体的内存布局、关键字段(如flags、mapping、引用计数等)以及相互关系,并介绍了页面标志系统、锁机制、分配释放等核心机制,为理解Linux内原创 2026-03-30 05:00:00 · 1319 阅读 · 0 评论
分享