扩展内存机制与实现详解
源码路径:rk3588/kernel-6.1/mm/vmalloc.c、gup.c、migrate.c、hugetlb.c、huge_memory.c、shmem.c、memfd.c、ksm.c、userfaultfd.c、hmm.c、damon/ 等
内核版本: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_START–VMALLOC_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 balancing、memory hotplug、CMA/compaction、memory 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)
- tmpfs、ashmem、memfd 底层
- 基于 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)
2.11 DAMON(damon/)
- 监控访问频率,模块可做 reclaim、lru_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 |
正在加载留言…