扩展内存机制与实现详解

扩展内存机制与实现详解

源码路径rk3588/kernel-6.1/mm/vmalloc.cgup.cmigrate.chugetlb.chuge_memory.cshmem.cmemfd.cksm.cuserfaultfd.chmm.cdamon/
内核版本:Linux 6.1(RK3588)
文档目录linuxDoc/mm/


目录


一、原理

除核心「页分配 + VMA + page cache + 回收」外,MM 还提供多种 专用内存机制,分别解决:

需求 机制
内核大块虚拟连续 vmalloc
固定用户页供 DMA GUP
页迁移 / 热插拔 migrate
大页 / TLB 优化 hugetlb / THP
共享匿名 / tmpfs shmem
密封匿名 fd memfd
同内容合并 KSM
用户态缺页 userfaultfd
设备内存镜像 HMM
访问模式监控 DAMON

二、实现方式

2.1 vmalloc(vmalloc.c)

  • VMALLOC_STARTVMALLOC_END 虚拟范围分配 连续虚拟地址
  • 物理页逐页 alloc_page,通过 vmalloc 页表 映射
  • 用于模块加载、大缓冲区、vmap
  • vmalloc_init 建立 vmap_area 红黑树/链表管理

2.2 GUP(gup.c)

get_user_pages / pin_user_pages

  • 遍历用户 PTE,将页 pin 住(增加 ref),供 RDMA、VFIO、io_uring、drm 等 DMA
  • FOLL_* 标志:写、force、longterm 等
  • mmu_notifier 协同(设备 unmap 通知)

2.3 migrate(migrate.c)

migrate_pages / unmap_and_move

  • 将 folio 从一组 PFN 搬到新 PFN
  • 更新 rmap PTE,flush TLB
  • 用于 NUMA balancingmemory hotplugCMA/compactionmemory failure

2.4 hugetlb(hugetlb.c)

  • 启动预留或运行时从 buddy 分配 大页池(如 2MB)
  • hugetlbfs 文件系统 mmap 使用固定大页
  • hugetlb_cgroup.c 限制大页使用

2.5 透明大页 THP(huge_memory.c + khugepaged.c)

  • khugepaged 内核线程:扫描匿名 VMA,合并为 PMD 大页
  • fault 路径 create_huge_pmd(04 文档)
  • sysfs /sys/kernel/mm/transparent_hugepage

2.6 shmem(shmem.c)

  • tmpfsashmemmemfd 底层
  • 基于 shmemfs 的 page cache + swap 支持
  • shmem_mmap、写时复制、锁页

2.7 memfd(memfd.c)

  • memfd_create:匿名 sealed 内存 fd
  • 与 shmem 集成,Android 共享内存常用

2.8 KSM(ksm.c)

  • 扫描匿名页内容,合并相同页 为一份只读共享
  • 写时拆分;虚拟机去重场景多,嵌入式较少开

2.9 userfaultfd(userfaultfd.c)

  • 用户注册 缺页 / 迁移 处理
  • QEMU live migration、用户态 pager

2.10 HMM(hmm.c)

  • GPU 等设备与进程地址空间 镜像、迁移设备页

2.11 DAMON(damon/)

  • 监控访问频率,模块可做 reclaimlru_sort 等策略实验

2.12 其它

文件 说明
memory_hotplug.c 内存热插拔
memory-failure.c 硬件错误页隔离
secretmem.c 加密内存(若启用)
memremap.c ZONE_DEVICE 持久内存

三、各机制对照表

机制 CONFIG 主要 API
vmalloc 内置 vmalloc, vfree
GUP 内置 get_user_pages
migrate CONFIG_MIGRATION migrate_pages
hugetlb CONFIG_HUGETLBFS hugetlb_alloc
THP CONFIG_TRANSPARENT_HUGEPAGE khugepaged
shmem 内置 shmemfs
memfd CONFIG_MEMFD_CREATE memfd_create
KSM CONFIG_KSM ksmd
userfaultfd CONFIG_USERFAULTFD userfaultfd
HMM CONFIG_HMM_MIRROR hmm API
DAMON CONFIG_DAMON debugfs/sysfs

四、RK3588 平台说明

机制 RK 相关性
GUP / dmabuf 编解码 buffer 与用户空间共享
CMA + migrate 09/07 文档,大块 buffer
THP 可选,匿名大堆可能降 TLB miss
shmem/memfd Android 图形 buffer、共享内存
hugetlb 一般不用,除非专用性能调优
KSM 嵌入式少见
DAMON 调试/研究用途

五、调试与观测

机制 观测
THP /sys/kernel/mm/transparent_hugepage/enabled
hugetlb /proc/meminfo HugePages_*
KSM /sys/kernel/mm/ksm/*
DAMON CONFIG_DAMON debugfs

附录:源码索引

主题 文件
vmalloc vmalloc.c
GUP gup.c
migrate migrate.c
hugetlb hugetlb.c
THP huge_memory.c, khugepaged.c
shmem shmem.c
memfd memfd.c

文章互动

阅读 --

留言

0 条留言

正在加载留言…