专栏定位
面向有一定内核基础的开发者,从 Linux MM 的经典机制出发,沿进化脉络逐步引出 HMM,每篇文章遵循"经典 MM 怎么做 → 为什么不够 → 如何扩展"的三段式结构。
开篇
建立全局视野,理解为什么需要学习 HMM,以及整个专栏的学习路线。
| # | 标题 | 核心内容 |
|---|---|---|
| -1 | Linux 内存管理子系统的进化:从 MM 到 HMM | 专栏概述;MM 到 HMM 的进化脉络;章节结构导航 |
| 0 | 专栏导读:为什么需要从 MM 理解 HMM | 异构计算的硬件背景(GPU/CXL/SmartNIC);HMM 解决什么问题;进化时间线总览;学习路线图 |
第一篇章:经典 MM 基础(第 1-5 篇)
建立 MM 模型,为后续"扩展"做铺垫。按自顶向下的逻辑组织:地址空间 → 区域划分 → 物理存储 → 映射机制 → 按需分配 → 内存回收。
| # | 标题 | 核心内容 |
|---|---|---|
| 1 | 虚拟地址空间与 VMA:进程的私有世界如何划分 | 进程地址空间布局;mm_struct;vm_area_struct;vm_flags(权限/类型);VMA 查找与合并;maple tree |
| 2 | struct page 与 PFN:VMA 背后的物理存储 | page/folio 结构体;引用计数与 flags;PFN ↔ page 转换;memmap 数组;为什么 HMM 需要设备内存也有 struct page |
| 3 | 页表:连接虚拟与物理的桥梁 | 五级页表(PGD→PTE);PTE 格式与标志位;页表遍历过程;/proc/pid/pagemap 实验 |
| 4 | 缺页处理:按需分配的艺术 | handle_mm_fault() 全流程;匿名页/文件页/写时复制;FAULT_FLAG_* 标志;mmap_lock |
| 5 | 页面回收与交换:内存不够时怎么办 | LRU 链表;kswapd/direct reclaim;swap entry 编码;do_swap_page() 换入流程 |
第二篇章:MM 的通用框架(第 6-9 篇)
这些框架最初为 CPU 内存设计,后来被 HMM 复用
| # | 标题 | 核心内容 |
|---|---|---|
| 6 | 页表遍历框架:walk_page_range() 的设计哲学 | mm_walk_ops 回调表;各级 entry 回调;PGWALK_RDLOCK/WRLOCK;如何写一个自定义 walker |
| 7 | NUMA 与页面迁移:把页面搬到正确的地方 | NUMA 拓扑;migrate_pages() 三阶段;迁移 PTE(migration entry);自动 NUMA 均衡 |
| 8 | MMU Notifier(上):KVM 催生的页表变化通知 | 问题背景(KVM EPT 同步);mmu_notifier_ops;注册/注销生命周期;invalidate 回调语义 |
| 9 | MMU Notifier(下):mmu_interval_notifier 与序列号协议 | 区间树设计;mmu_interval_read_begin/retry;blockable 判定;与 HMM 的关系预告 |
第三篇章:设备内存的引入(第 10-14 篇)
MM 进化的关键转折——让设备内存成为一等公民
| # | 标题 | 核心内容 |
|---|---|---|
| 10 | 异构计算的挑战:为什么 MM 需要进化 | GPU 编程模型的痛点(显式拷贝 vs 统一寻址);CUDA Unified Memory / HSA 的需求;内核需要解决什么 |
| 11 | ZONE_DEVICE:为设备内存创建 struct page | 为什么需要 struct page;ZONE_DEVICE 的实现原理;memremap_pages() 热插拔;内存类型枚举 |
| 12 | dev_pagemap:设备内存区域的控制面 | dev_pagemap 结构体详解;dev_pagemap_ops(migrate_to_ram / folio_free);生命周期管理 |
| 13 | 非驻留 PTE 的新成员:Device Private & Exclusive Entry | swap entry 编码回顾;device private entry 的编码与语义;device exclusive entry;make_device_exclusive() |
| 14 | 设备页面迁移:migrate_vma 三阶段详解 | migrate_vma_setup/pages/finalize;MIGRATE_PFN_* 标志;锁协议;与 NUMA 迁移的对比;migrate_device_*() |
第四篇章:HMM 核心机制(第 15-18 篇)
胶水层的全貌——700 行代码如何粘合一切
| # | 标题 | 核心内容 |
|---|---|---|
| 15 | HMM 总览:架构、数据结构与 API 全景 | hmm_range 结构体;hmm_pfn_flags 编码;HMM 与 MMU Notifier/ZONE_DEVICE/migrate_vma 的关系图 |
| 16 | hmm_range_fault() 逐行解析(上):遍历与 PFN 提取 | 入口流程;walk_page_range() 调用;各级回调实现;正常 PTE 的 PFN 提取 |
| 17 | hmm_range_fault() 逐行解析(下):非驻留 PTE 与 fault 策略 | swap/migration/device entry 处理;FAULT_FLAG_REMOTE 缺页;序列号 retry 逻辑;错误返回语义 |
| 18 | HMM 与 DMA:从 PFN 到总线地址 | HMM DMA helpers;dma_map_page() 集成;P2PDMA 标志;scatter-gather 构建 |
第五篇章:实际驱动应用(第 19-24 篇)
从测试模块到生产级 GPU 驱动
| # | 标题 | 核心内容 |
|---|---|---|
| 19 | test_hmm:内核自测模块的最佳实践 | 模块结构;ZONE_DEVICE 注册;hmm_range_fault 使用;migrate_vma 使用;用户态自测流程 |
| 20 | drm_gpusvm:DRM 子系统的 HMM 通用封装 | 设计目标;drm_gpusvm_range;notifier 管理;页面获取与映射;驱动接入接口 |
| 21 | Intel Xe:基于 HMM 的 GPU 共享虚拟内存与页面迁移 | xe_svm 架构;基于 drm_gpusvm 的集成;错误恢复;性能优化策略 |
| 22 | AMD KFD SVM:完整的双向迁移实现 | kfd_svm 架构;CPU→VRAM 迁移流程;VRAM→CPU 回迁;与 ROCm 用户态的配合 |
| 23 | amdgpu HMM:userptr BO 的页表同步 | amdgpu_hmm 的 notifier 注册;hmm_range_fault 获取用户页面;与 TTM 的集成 |
附录
| # | 标题 | 内容 |
|---|---|---|
| A | 术语表 | PFN、VMA、ZONE_DEVICE、migration entry 等核心术语速查 |

605

被折叠的 条评论
为什么被折叠?



