CMA 与连续内存分配

这页讲的是:有些设备路径真的需要较大块的连续物理内存,但系统又不想从开机起把整片区域完全浪费死。学这页的重点,是理解 CMA 更像“为未来连续物理内存需求预留并尽量可回收借用的一片地”,它是在一般页分配和刚性连续需求之间做折中。

这块是什么

CMA 与连续内存分配,讲的是 Linux 怎样提前为可能出现的大块连续物理内存需求留出活动空间,同时又尽量让这片空间在平时能被系统临时利用。它关注的是“连续物理内存需求怎样更有把握地满足”,而不是等真正要用时再在已经碎掉的物理版图里临时碰运气。

可以把它理解成:场馆知道后面有大型活动可能要腾出整片连着的场地,所以平时会把这片区域先借给普通活动使用,但要求大家别在上面搭起挪不走的重设施。等大型活动真来了,场地还能尽量被清出来。

它负责什么

为连续物理内存需求提前留路

  • 给需要大块连续物理页的设备路径增加成功率
  • 避免完全依赖运行时高阶页碰运气
  • 把连续性需求从“现场临时抢”改成“提前规划”
  • 让设备侧严格约束更容易被系统接住

让预留区域平时尽量不浪费

  • 不是一刀切把一整片区域永远闲置
  • 平时可在一定条件下先借给普通页使用
  • 等真正需要时再尽量迁移、腾挪、回收
  • 让保守预留和资源利用率之间取得平衡

把连续性问题前置到系统规划层

  • 连续物理内存不再只是伙伴系统临场发挥的问题
  • 结合迁移能力、页类型和内存布局一起考虑
  • 帮助系统在长期运行中仍保住关键连续区域
  • 让大块物理连续需求更具可预期性

为什么它不是“再试一次高阶页分配”

如果想得太简单会怎样真正关键在哪
觉得 CMA 只是伙伴系统失败后的备胎会忽略它其实是在更早阶段就为连续性做规划。它的价值在于提前保路,而不是事后多试一次。
把它当永久专用保留区会低估它平时可被借用、需要迁移腾挪的折中设计。CMA 追求的是既保连续需求,又尽量少浪费。
觉得它和 vmalloc 差不多会混淆物理连续需求和虚拟连续需求。CMA 盯的是设备常在乎的物理连续,而 vmalloc 盯的是 CPU 视角的虚拟连续。
只把它看成驱动小技巧会漏掉它背后牵涉内存布局、页迁移和系统长期碎片管理。它是整套内存规划与设备需求之间的折中方案。

关键概念

概念现在怎么理解
CMA为未来连续物理内存需求预留且尽量可复用的一类内存组织机制。
连续物理内存设备或特定路径真正需要一整块相邻物理页时关心的东西。
预留区域系统提前划出、希望日后还能清理回连续状态的一片空间。
可迁移页平时借住在这片区域里的内容,最好能在需要时被挪走。
长期可用性不是只看现在能不能拿到连续块,而是看系统跑久后还能不能继续拿。

为什么重要

常见误解

它不负责什么

和其他模块的关系

相关模块关系
buddy allocatorCMA 不是绕开伙伴系统,而是在它之上提前保住更可能成功的大块连续物理页来源。
DMA 与设备路径很多真正推动 CMA 存在的需求,来自设备对连续物理内存的严格要求。
vmalloc两者正好帮助你分清“CPU 想看起来连续”和“设备真的要物理连续”这两类问题。
页迁移与回收预留区平时能否借用、需要时能否清回来,和可迁移性、回收整理能力关系很深。

读完这页后,你应该能回答

后面适合继续问:哪些设备需求最容易长成 CMA 问题?为什么平时可借用、需要时能清回这件事并不容易?如果系统里很多不可迁移内容早早压住这片区域,会发生什么?