本术语表面向“从 MM 到 HMM”专栏阅读过程中的快速查阅。它不是内核 API 手册,而是把文章中反复出现的概念放到同一张地图上:先给出直观含义,再说明它在 Linux MM/HMM 语境里的作用。
建议阅读方式:
- 初读专栏时,把它当作“遇到缩写就查一下”的速查表;
- 读 HMM、迁移、DRM SVM 章节时,重点查
ZONE_DEVICE、dev_pagemap、mmu_interval_notifier、hmm_range、migrate_vma、device private entry; - 做驱动接入时,重点查
dev_private_owner、drm_gpusvm_range、drm_pagemap、DMA mapping、invalidate、retry。
1. 地址空间与 VMA
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| 虚拟地址 | Virtual Address / VA | 进程看到的地址,不直接等于物理内存地址。CPU 通过页表把 VA 翻译成 PA。 |
| 物理地址 | Physical Address / PA | CPU 物理地址空间中的地址,通常由内存控制器、平台固件、设备 BAR 等共同定义。 |
| 总线地址 | Bus Address / DMA Address / IOVA | 设备发起 DMA 时使用的地址。可能等于物理地址,也可能是 IOMMU 翻译后的 IOVA。 |
| 进程地址空间 | Process Address Space | 一个进程拥有的用户虚拟地址布局,包括代码、堆、栈、mmap 区域等。 |
mm_struct | struct mm_struct | 描述进程用户地址空间的核心结构,保存 VMA、页表、锁和统计信息。 |
| VMA | struct vm_area_struct | 一段连续虚拟地址范围,带有权限、映射类型和文件/匿名页信息。 |
vm_flags | VMA flags | 描述 VMA 权限和属性,如VM_READ、VM_WRITE、VM_SHARED、VM_HUGETLB。 |
mmap_lock | mmap_read_lock()/mmap_write_lock() | 保护 VMA 树和地址空间布局的读写锁。 |
| Maple Tree | mm->mm_mt | 现代 Linux 用于管理 VMA 的树结构,替代旧红黑树方案。 |
| 用户态映射 | User Mapping | 用户进程通过mmap()、匿名分配、文件映射等建立的 VA 区间。 |
| 匿名映射 | Anonymous Mapping | 没有文件后端的内存,例如 heap、anonymous mmap。 |
| 文件映射 | File-backed Mapping | VMA 背后有文件页缓存作为后端。 |
| COW | Copy-On-Write | 写时复制。多个映射共享同一页,第一次写入时复制新页。 |
mprotect() | Memory Protection Change | 修改 VMA 权限,可能触发页表和 MMU notifier invalidation。 |
munmap() | Unmap User Range | 删除用户虚拟地址范围,触发页表拆除和 notifier。 |
mremap() | Remap User Range | 移动或扩展已有映射,改变 VA 结构。 |
2. page、folio 与 PFN
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| 页 | Page | Linux 内存管理的基本物理单位,常见大小为 4 KiB。 |
struct page | Page Descriptor | 内核描述一个物理页帧的元数据结构。 |
| Folio | struct folio | 一组物理连续、语义上一起管理的页,减少传统struct pageAPI 的歧义。 |
| PFN | Page Frame Number | 物理页帧号,通常是物理地址右移PAGE_SHIFT。 |
pfn_to_page() | PFN to page | 从 PFN 找到对应struct page。 |
page_to_pfn() | page to PFN | 从struct page反推 PFN。 |
| memmap | vmemmap/ memmap array | 保存所有struct page的线性映射区域。 |
| 引用计数 | Page Refcount | 记录页面被多少对象引用,防止仍在使用时释放。 |
| page flags | page->flags | 描述页面状态,如 dirty、locked、LRU、zone、device page 类型等。 |
| Page lock | Page/Folio Lock | 保护单页或 folio 状态转换的锁。 |
| compound page | Compound Page | 多个 base page 组成的复合页,用于 THP、HugeTLB、较大设备页等。 |
| order | Page Order | 表示连续页数量为2^order。 |
| zero page | Zero Page | 只读共享的全零页,常用于未写入的匿名映射。 |
| LRU | Least Recently Used | Linux 页面回收链表体系,用于决定哪些页可回收。 |
| Dirty page | Dirty Page | 内容已被修改但尚未写回后端的页面。 |
| Page cache | Page Cache | 文件数据在内存中的缓存。 |
| GUP | get_user_pages() | 获取用户页引用的机制,常用于 RDMA、IO、长期 pin。 |
| long-term pin | Long-term Page Pin | 长时间固定页面,可能阻碍迁移、回收、COW。 |
3. 页表与 PTE 编码
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| 页表 | Page Table | VA 到 PA/PFN 的多级映射结构。 |
| PGD/P4D/PUD/PMD/PTE | Page Table Levels | Linux 五级页表的各级 entry。 |
| PTE | Page Table Entry | 最底层页表项,通常映射一个 base page,也可编码特殊非 present entry。 |
| present PTE | Present PTE | 表示当前 VA 有有效物理页映射。 |
| non-present PTE | Non-present PTE | PTE present 位不置位,但可能编码 swap、migration、device private 等状态。 |
| writable PTE | Writable PTE | 页表项允许写入。 |
| young/accessed | Accessed Bit | 硬件或内核标记页面近期被访问。 |
| dirty bit | Dirty Bit | 标记页面被写过。 |
| swap entry | Swap PTE Encoding | 非 present PTE 中编码 swap 类型和 offset 的格式。 |
| migration entry | Migration Entry | 页面迁移期间临时放入页表的非 present entry,指向正在迁移的页。 |
| device private entry | Device Private Entry | 表示页面数据在设备私有内存中,CPU 不能直接访问,需要 fault 回迁。 |
| device exclusive entry | Device Exclusive Entry | 表示设备临时独占访问某个页,CPU PTE 被替换成特殊 entry。 |
| soft-dirty | Soft Dirty | Linux 追踪用户页写入的一类软件标志/机制。 |
| page table walk | Page Walk | 遍历页表层级读取或修改 entry 的过程。 |
walk_page_range() | Generic Page Walk API | 内核通用页表遍历框架,调用mm_walk_ops回调。 |
mm_walk_ops | Page Walk Callbacks | 页表遍历回调集合,如pmd_entry、pte_entry、pte_hole。 |
| PTE hole | Page Table Hole | 某段 VA 没有页表或没有 PTE 映射。 |
| HugeTLB | HugeTLB Pages | 显式大页机制,使用 hugetlbfs 或特定 API 分配。 |
| THP | Transparent Huge Page | 透明大页,内核自动把连续小页合并为 PMD/PUD 级映射。 |
| PMD 映射 | PMD-sized Mapping | PMD 级别直接映射大页,常见大小 2 MiB。 |
| TLB | Translation Lookaside Buffer | CPU/GPU 缓存地址翻译结果的硬件结构。 |
| TLB shootdown | TLB Invalidation | 页表变化后让 CPU/GPU 丢弃旧翻译缓存。 |
4. 缺页、回收与迁移
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| 缺页异常 | Page Fault | CPU 访问 VA 时页表无法直接满足访问,引发异常进入内核处理。 |
handle_mm_fault() | MM Fault Handler | Linux 处理用户态缺页的核心入口。 |
| minor fault | Minor Page Fault | 不需要从磁盘读取,只需建立页表或分配页面的 fault。 |
| major fault | Major Page Fault | 需要从存储读取数据的 fault。 |
| remote fault | FAULT_FLAG_REMOTE | 不是当前 CPU 指令直接访问触发,而是由驱动/HMM 远程请求触发的 fault。 |
FAULT_FLAG_WRITE | Write Fault Flag | 表示 fault 需要写权限。 |
| 页面回收 | Page Reclaim | 内存紧张时回收可释放页面。 |
| kswapd | Kernel Swap Daemon | 后台内存回收线程。 |
| direct reclaim | Direct Reclaim | 分配内存路径上同步执行回收。 |
| swap out | Swap-out | 把匿名页写到 swap,释放内存。 |
| swap in | Swap-in | 缺页时从 swap 读回页面。 |
| 页面迁移 | Page Migration | 把页面内容从一个物理页搬到另一个物理页,同时保持 VA 语义不变。 |
| NUMA migration | NUMA Page Migration | 为了靠近 CPU 或内存节点而迁移系统内存页。 |
| 自动 NUMA 均衡 | AutoNUMA | 内核自动根据访问模式迁移页面到合适 NUMA 节点。 |
migrate_pages() | Generic Page Migration | 通用页面迁移接口,常用于 NUMA、内存规整等。 |
migrate_vma | VMA-based Migration | 面向驱动的页面迁移框架,用于 CPU 内存和设备内存之间迁移。 |
migrate_vma_setup() | Migration Phase 1 | 收集并锁定源页,把 CPU PTE 替换成 migration entry。 |
migrate_vma_pages() | Migration Phase 2 | 提交页面元数据迁移,决定哪些页迁移成功。 |
migrate_vma_finalize() | Migration Phase 3 | 恢复或安装最终页表 entry,释放迁移临时状态。 |
MIGRATE_PFN_* | Migration PFN Flags | migrate_vma的 src/dst PFN 数组标志,描述 valid、write、migrate 等状态。 |
| 回迁 | Migrate Back to RAM | 把 device private page 迁回系统内存。 |
| eviction | Eviction | 从设备内存驱逐数据,通常迁回系统内存以释放设备内存。 |
5. MMU Notifier 与同步协议
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| MMU notifier | mmu_notifier | 当 CPU 页表变化时通知外部页表拥有者,如 KVM、GPU、RDMA。 |
| interval notifier | mmu_interval_notifier | 针对某个 VA 区间的 notifier,配合序列号读/重试协议。 |
| invalidate | Invalidation | CPU 页表变化时,通知外部映射失效。 |
mmu_notifier_range | Invalidation Range | 描述失效事件的地址范围、事件类型、owner、是否 blockable 等。 |
MMU_NOTIFY_UNMAP | Unmap Event | 表示 VA 被解除映射。GPU/设备映射通常必须销毁。 |
MMU_NOTIFY_MIGRATE | Migration Event | 表示页面迁移事件。驱动可通过 owner 判断是否是自己发起。 |
| blockable | mmu_notifier_range_blockable() | 表示 notifier 回调是否允许阻塞睡眠。 |
mmu_interval_read_begin() | Read Begin | 读取 interval notifier 当前序列号,开始一次受保护的页表快照。 |
mmu_interval_read_retry() | Read Retry Check | 在驱动锁下检查读取期间是否发生 invalidation。 |
mmu_interval_set_seq() | Set Invalidate Sequence | notifier invalidate 回调中更新序列号,使并发 reader 重试。 |
| notifier seq | Invalidation Sequence | 用于判断 HMM PFN 快照是否过期的序列号。 |
| driver update lock | Driver Page Table Lock | 驱动保护设备页表更新的锁,和 notifier retry 配合使用。 |
| retry loop | Retry Loop | 页表变化、迁移、invalidation 竞态下反复重新获取状态的模式。 |
| stale mapping | Stale Device Mapping | 设备页表或 DMA mapping 指向已经失效的 CPU 页表状态。 |
6. ZONE_DEVICE 与 dev_pagemap
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| ZONE_DEVICE | Device Memory Zone | Linux 为设备内存建立struct page的内存 zone。 |
dev_pagemap | struct dev_pagemap | 描述一段设备内存 PFN 范围、类型、owner 和回调的控制结构。 |
memremap_pages() | Register Device Pages | 把设备物理地址范围注册为拥有struct page的 ZONE_DEVICE 页面。 |
pgmap->owner | Device Page Owner | 标识设备页属于哪个驱动/设备实例。 |
dev_pagemap_ops | Device Page Operations | 设备页生命周期回调集合,如migrate_to_ram、folio_free。 |
migrate_to_ram | Device Page Fault Back | CPU 访问 device private page 时,把它迁回系统内存的回调。 |
folio_free | Device Folio Free | 设备页释放时的回调。 |
MEMORY_DEVICE_PRIVATE | Device Private Memory | 设备私有内存,CPU 通常不能直接访问,需要迁移回 RAM。 |
MEMORY_DEVICE_COHERENT | Device Coherent Memory | 设备内存与 CPU coherent,CPU 可直接访问,但仍属于 ZONE_DEVICE。 |
MEMORY_DEVICE_FS_DAX | FS DAX Device Memory | 文件系统 DAX 使用的设备内存类型。 |
| device page | Device-backedstruct page | 代表设备内存 PFN 的struct page。 |
| system page | System RAM Page | 普通系统内存页面。 |
| backing page | Fake Backing Store | test_hmm用普通系统页模拟设备私有内存内容的技巧。 |
zone_device_data | Device Page Private Data | struct page中供设备页保存私有数据的字段。 |
| device private owner | dev_private_owner | HMM range 中用于识别“本设备 device private page”的 owner。 |
7. HMM 核心术语
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| HMM | Heterogeneous Memory Management | Linux 支持 CPU 与设备共享虚拟地址和页面迁移的一组机制。 |
| SVM | Shared Virtual Memory | CPU 和设备共享同一虚拟地址语义的编程模型。 |
| mirror | Address Space Mirror | 设备侧维护一份 CPU 地址空间映射的镜像。 |
| HMM mirror | HMM_MIRROR | HMM 依赖的配置/能力,用于驱动镜像用户地址空间。 |
hmm_range | struct hmm_range | HMM 获取一段 VA 对应 PFN 状态的输入/输出对象。 |
hmm_range_fault() | HMM Range Fault | 遍历 CPU 页表并按策略 fault 页面,输出hmm_pfns[]。 |
hmm_pfns[] | HMM PFN Array | HMM 输出数组,每项包含 PFN 和HMM_PFN_*flags。 |
HMM_PFN_VALID | Valid HMM PFN | 表示对应 VA 有可用 PFN。 |
HMM_PFN_WRITE | Writable HMM PFN | 表示该 PFN 对请求者可写。 |
HMM_PFN_ERROR | Error HMM PFN | 表示该地址 fault/解析出错。 |
HMM_PFN_REQ_FAULT | Request Fault | 请求 HMM 对无效/未驻留页面触发 fault。 |
HMM_PFN_REQ_WRITE | Request Write | 请求 HMM 获取可写权限,必要时触发写 fault/COW。 |
HMM_PFN_DMA_MAPPED | DMA Mapped Flag | 表示 PFN 已有 DMA 映射状态的标记。 |
HMM_PFN_P2PDMA | P2PDMA Flag | 表示页面可用于 PCI peer-to-peer DMA。 |
HMM_PFN_P2PDMA_BUS | P2PDMA Bus Flag | 表示 P2PDMA 使用 bus address 语义。 |
map_order | HMM Mapping Order | HMM PFN 中编码的页表映射粒度。 |
hmm_pfn_to_page() | HMM PFN to Page | 从 HMM PFN 项取得struct page。 |
hmm_pfn_to_phys() | HMM PFN to Physical Address | 从 HMM PFN 项取得物理地址。 |
hmm_pfn_to_map_order() | HMM PFN to Mapping Order | 读取 HMM PFN 中的映射阶数。 |
default_flags | HMM Default Request Flags | 对整个 range 默认使用的 HMM 请求标志。 |
pfn_flags_mask | HMM PFN Flags Mask | 限制 HMM 输出哪些 flag 的掩码。 |
notifier_seq | HMM Range Sequence | hmm_range保存的 interval notifier 序列号。 |
| non-resident | Non-resident Page | 页面数据不在普通 CPU present PTE 中,可能在 swap、migration、device memory。 |
| fault strategy | HMM Fault Policy | HMM 遇到 hole、swap、device entry 时是触发 fault、等待、还是返回 invalid。 |
8. DMA、IOMMU 与 P2P
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| DMA | Direct Memory Access | 设备不经过 CPU load/store,直接访问内存。 |
| DMA mapping | dma_map_page()等 | 把 CPU 侧页面转换成设备可访问 DMA 地址,并处理 cache/IOMMU。 |
dma_map_page() | Map One Page for DMA | 把单页或连续页映射给设备访问。 |
dma_unmap_page() | Unmap DMA Page | 撤销 DMA mapping,释放 IOMMU/cache 相关状态。 |
| IOMMU | I/O Memory Management Unit | 为设备 DMA 地址提供地址转换和隔离的硬件。 |
| IOVA | I/O Virtual Address | IOMMU 暴露给设备的虚拟 DMA 地址。 |
| DMA direction | DMA_TO_DEVICE/DMA_BIDIRECTIONAL | DMA 方向,影响 cache 同步和权限。 |
| scatter-gather | SG List | 描述多个不连续内存段的 DMA 列表。 |
| P2PDMA | PCI Peer-to-Peer DMA | PCIe 设备之间直接访问彼此内存,绕过系统内存路径。 |
| PCI BAR | Base Address Register | PCI 设备暴露 MMIO 或内存窗口的地址资源。 |
| cache coherence | Cache Coherence | CPU cache 与设备访问同一内存时的一致性关系。 |
| coherent memory | Coherent Device Memory | CPU 和设备能保持一致访问的设备内存。 |
| bus address | Bus-visible Address | 设备在总线上发起事务时使用的地址。 |
9. DRM、GPU SVM 与驱动接入
| 术语 | 英文/代码 | 简明解释 |
|---|---|---|
| DRM | Direct Rendering Manager | Linux 图形/GPU 驱动子系统。 |
| GPUVM | drm_gpuvm | DRM 中管理 GPU 虚拟地址空间和 VM bind/unbind 的框架。 |
| GPUSVM | drm_gpusvm | DRM 中封装 HMM/SVM 页获取、notifier、range、DMA/device mapping 的框架。 |
drm_gpusvm | struct drm_gpusvm | 一个 DRM GPU SVM 实例,通常嵌在驱动 VM 对象中。 |
drm_gpusvm_notifier | GPUSVM Notifier | 管理一段较大 VA 区间的 interval notifier,并挂载多个 range。 |
drm_gpusvm_range | GPUSVM Range | GPU fault 后建立的较小 VA 区间,保存 pages 和映射状态。 |
drm_gpusvm_pages | GPUSVM Pages | 保存dma_addr[]、dpagemap、notifier_seq和 flags 的结构。 |
drm_gpusvm_ctx | GPUSVM Context | 一次 GPUSVM 操作的策略参数,如 read-only、allow-mixed、devmem-only。 |
drm_gpusvm_ops | GPUSVM Driver Ops | 驱动提供给通用层的回调,如 range 分配和 invalidate。 |
drm_gpusvm_range_find_or_insert() | Find/Create GPUSVM Range | GPU fault 时查找或创建 notifier/range。 |
drm_gpusvm_get_pages() | GPUSVM Page Acquisition | 封装 HMM PFN 获取与 DMA/device address 映射。 |
drm_gpusvm_range_get_pages() | Range Get Pages | 针对一个 GPUSVM range 调用drm_gpusvm_get_pages()。 |
drm_gpusvm_range_pages_valid() | Range Valid Check | GPU binding 前检查 range pages 是否仍有效。 |
drm_gpusvm_range_unmap_pages() | Range Unmap Pages | notifier invalidate 中撤销 range 的 DMA/device mapping。 |
drm_gpusvm_range_set_unmapped() | Mark Range Unmapped | MMU_NOTIFY_UNMAP时标记 range 已失效,并记录 partial unmap。 |
drm_gpusvm_range_evict() | Evict GPUSVM Range | 借助 HMM fault 把 range 中的 device private page 拉回系统内存。 |
drm_gpusvm_scan_mm() | Scan Migration State | 观察 range 当前是 system、device、mixed 还是 unpopulated。 |
drm_pagemap | DRM Device Memory Helper | DRM 对dev_pagemap和设备页映射的辅助封装。 |
drm_pagemap_addr | DRM Page Address | DRM 用于表示 system DMA address 或 device interconnect address 的编码。 |
| VM bind | GPU VM Bind | 把一段内存绑定到 GPU 虚拟地址空间。 |
| GPU page fault | GPU Fault | GPU 访问缺失或无权限 VA 时产生的 fault。 |
| GPU page table | GPU Page Table | GPU 自己的虚拟地址翻译结构。 |
| GPU TLB invalidate | GPU TLB Flush | GPU 页表变化后撤销硬件缓存的翻译。 |
| garbage collector | Driver GC | 驱动延迟清理 unmapped range、unbind GPU 页表、释放 range 的机制。 |
| userptr | User Pointer BO | GPU 驱动把用户进程已有内存作为 buffer 使用的机制。 |
| BO | Buffer Object | DRM/TTM/GEM 中表示 GPU 可用内存对象的抽象。 |
| TTM | Translation Table Maps | DRM 内存管理框架,常用于 BO、VRAM、GTT 管理。 |
| VRAM | Video RAM | GPU 本地显存。 |
| GTT | Graphics Translation Table | GPU 访问系统内存或显存的一类地址转换机制,具体含义依驱动而异。 |
| fault queue | GPU Fault Queue | GPU/驱动记录 fault 事件并交给内核处理的队列。 |
| fence | DMA Fence / GPU Fence | 表示 GPU 异步任务完成状态的同步对象。 |
| dma-resv | DMA Reservation Object | BO 共享同步对象,用于协调 fence 和访问。 |
| PASID | Process Address Space ID | PCIe/设备侧区分进程地址空间的 ID。 |
| ATS | Address Translation Service | PCIe 设备向 IOMMU/CPU 地址转换体系请求翻译的能力。 |
| PRI | Page Request Interface | PCIe 设备请求主机处理缺页的机制。 |
11. 常见缩写速查
| 缩写 | 全称 | 中文含义 |
|---|---|---|
| VA | Virtual Address | 虚拟地址 |
| PA | Physical Address | 物理地址 |
| PFN | Page Frame Number | 物理页帧号 |
| PTE | Page Table Entry | 页表项 |
| PMD | Page Middle Directory | 页中间目录级页表项 |
| PUD | Page Upper Directory | 页上级目录级页表项 |
| PGD | Page Global Directory | 页全局目录级页表项 |
| VMA | Virtual Memory Area | 虚拟内存区域 |
| MM | Memory Management | 内存管理子系统 |
| HMM | Heterogeneous Memory Management | 异构内存管理 |
| SVM | Shared Virtual Memory | 共享虚拟内存 |
| DMA | Direct Memory Access | 直接内存访问 |
| IOMMU | I/O Memory Management Unit | I/O 内存管理单元 |
| IOVA | I/O Virtual Address | I/O 虚拟地址 |
| DAX | Direct Access | 持久内存/设备内存直接访问机制 |
| THP | Transparent Huge Page | 透明大页 |
| TLB | Translation Lookaside Buffer | 地址翻译缓存 |
| COW | Copy-On-Write | 写时复制 |
| GUP | Get User Pages | 获取用户页引用 |
| LRU | Least Recently Used | 最近最少使用回收链表 |
| DRM | Direct Rendering Manager | Linux 图形/GPU 驱动子系统 |
| BO | Buffer Object | 缓冲对象 |
| TTM | Translation Table Maps | DRM 内存管理框架 |
| VRAM | Video RAM | 显存 |
| GTT | Graphics Translation Table | GPU 图形地址转换表 |
| PASID | Process Address Space ID | 进程地址空间 ID |
| ATS | Address Translation Service | 地址转换服务 |
| PRI | Page Request Interface | 页面请求接口 |
| P2P | Peer-to-Peer | 设备间点对点访问 |
12. 容易混淆的概念对照
12.1 PFN、物理地址、DMA 地址
| 概念 | 谁使用 | 是否一定相同 | 典型转换 |
|---|---|---|---|
| PFN | 内核 MM | 不等于地址,只是页帧编号 | page_to_pfn()/pfn_to_page() |
| 物理地址 | CPU 物理地址空间 | 可能和 DMA 地址不同 | PFN << PAGE_SHIFT |
| DMA 地址 | 设备 DMA 引擎 | 有 IOMMU 时通常不同于物理地址 | dma_map_page() |
12.2 system page、device private page、device coherent page
| 类型 | CPU 能否直接访问 | 是否有struct page | 典型用途 |
|---|---|---|---|
| system page | 可以 | 有 | 普通系统内存 |
| device private page | 通常不可以 | 有,来自 ZONE_DEVICE | GPU VRAM/设备私有内存,CPU fault 时回迁 |
| device coherent page | 可以 | 有,来自 ZONE_DEVICE | CXL/一致性设备内存,CPU 与设备共享访问 |
12.3mmu_notifier与mmu_interval_notifier
| 机制 | 粒度 | 常见使用者 | 重点 |
|---|---|---|---|
mmu_notifier | 整个 mm 或 broad callback | KVM、驱动基础同步 | 接收 CPU 页表变化通知 |
mmu_interval_notifier | 指定 VA interval | HMM、device mirror、userptr | read begin/retry 序列号协议 |
12.4migrate_pages()与migrate_vma
| 机制 | 面向对象 | 谁分配目标页 | HMM 相关性 |
|---|---|---|---|
migrate_pages() | 一组 folio/page | 通用 MM/NUMA 路径 | 是历史基础 |
migrate_vma | 某个 VMA 地址范围 | 驱动参与分配 device/system 目标页 | HMM 设备迁移核心机制 |
13. 一句话总结
- VMA 是“这段虚拟地址应该怎么用”。
- PTE 是“这一个虚拟页现在指向哪里”。
- PFN 是“物理页帧的编号”。
struct page是“内核认识这个物理页的身份证”。- ZONE_DEVICE 是“让设备内存也拿到身份证”。
dev_pagemap是“这段设备内存的户口本和回调表”。- device private entry 是“页在设备里,CPU 要访问请先回迁”。
- device exclusive entry 是“设备暂时独占,CPU 普通 PTE 先撤掉”。
- MMU notifier 是“CPU 页表变了,外部页表赶紧失效”。
mmu_interval_notifier是“只盯一段 VA,并用序列号判断快照是否过期”。- HMM 是“让设备读懂 CPU 地址空间,并能参与页面迁移”。
hmm_range_fault()是“把一段用户 VA 翻译成 HMM PFN 数组”。migrate_vma是“驱动参与的 CPU 内存和设备内存搬家流程”。- DMA mapping 是“把 CPU/内核认识的页转换成设备能访问的地址”。
test_hmm是“HMM 协议的最小可运行样板”。drm_gpusvm是“DRM 驱动接入 HMM/SVM 的通用骨架”。