CMA 与连续内存分配
这页讲的是:有些设备路径真的需要较大块的连续物理内存,但系统又不想从开机起把整片区域完全浪费死。学这页的重点,是理解 CMA 更像“为未来连续物理内存需求预留并尽量可回收借用的一片地”,它是在一般页分配和刚性连续需求之间做折中。
这块是什么
CMA 与连续内存分配,讲的是 Linux 怎样提前为可能出现的大块连续物理内存需求留出活动空间,同时又尽量让这片空间在平时能被系统临时利用。它关注的是“连续物理内存需求怎样更有把握地满足”,而不是等真正要用时再在已经碎掉的物理版图里临时碰运气。
可以把它理解成:场馆知道后面有大型活动可能要腾出整片连着的场地,所以平时会把这片区域先借给普通活动使用,但要求大家别在上面搭起挪不走的重设施。等大型活动真来了,场地还能尽量被清出来。
它负责什么
为连续物理内存需求提前留路
- 给需要大块连续物理页的设备路径增加成功率
- 避免完全依赖运行时高阶页碰运气
- 把连续性需求从“现场临时抢”改成“提前规划”
- 让设备侧严格约束更容易被系统接住
让预留区域平时尽量不浪费
- 不是一刀切把一整片区域永远闲置
- 平时可在一定条件下先借给普通页使用
- 等真正需要时再尽量迁移、腾挪、回收
- 让保守预留和资源利用率之间取得平衡
把连续性问题前置到系统规划层
- 连续物理内存不再只是伙伴系统临场发挥的问题
- 结合迁移能力、页类型和内存布局一起考虑
- 帮助系统在长期运行中仍保住关键连续区域
- 让大块物理连续需求更具可预期性
为什么它不是“再试一次高阶页分配”
| 如果想得太简单 | 会怎样 | 真正关键在哪 |
|---|
| 觉得 CMA 只是伙伴系统失败后的备胎 | 会忽略它其实是在更早阶段就为连续性做规划。 | 它的价值在于提前保路,而不是事后多试一次。 |
| 把它当永久专用保留区 | 会低估它平时可被借用、需要迁移腾挪的折中设计。 | CMA 追求的是既保连续需求,又尽量少浪费。 |
| 觉得它和 vmalloc 差不多 | 会混淆物理连续需求和虚拟连续需求。 | CMA 盯的是设备常在乎的物理连续,而 vmalloc 盯的是 CPU 视角的虚拟连续。 |
| 只把它看成驱动小技巧 | 会漏掉它背后牵涉内存布局、页迁移和系统长期碎片管理。 | 它是整套内存规划与设备需求之间的折中方案。 |
关键概念
| 概念 | 现在怎么理解 |
|---|
| CMA | 为未来连续物理内存需求预留且尽量可复用的一类内存组织机制。 |
| 连续物理内存 | 设备或特定路径真正需要一整块相邻物理页时关心的东西。 |
| 预留区域 | 系统提前划出、希望日后还能清理回连续状态的一片空间。 |
| 可迁移页 | 平时借住在这片区域里的内容,最好能在需要时被挪走。 |
| 长期可用性 | 不是只看现在能不能拿到连续块,而是看系统跑久后还能不能继续拿。 |
为什么重要
- 它解释了为什么某些设备路径不能简单接受“虚拟上连续就行”,而必须认真争取物理连续。
- 很多连续物理内存问题,真正难点不在单次分配调用,而在系统长期运行后的碎片化和版图演化。
- 理解这层后,你会更容易把 buddy allocator、页迁移、DMA 需求和系统启动时的内存规划联系起来。
- 它让你看到:面对严格设备约束时,Linux 常会把问题前移到更早的资源规划阶段。
常见误解
- 误解一:CMA 就是多留一点空闲内存。实际上关键不只是留,而是保住可整理成连续块的机会。
- 误解二:只要有 CMA,就不用担心碎片。实际上迁移、页类型和长期使用方式仍会影响效果。
- 误解三:它和 vmalloc 都是在解决“大内存”。实际上一个解决物理连续,一个解决虚拟连续。
它不负责什么
- 它不替代普通页分配;日常大多数分配仍然走一般页供应与上层分配器。
- 它不等于用户态大页,也不等于页表映射技巧;它盯的是连续物理页块的可获得性。
- 它不保证所有设备问题都自动消失;设备可达性、映射和同步规则仍要额外设计。
和其他模块的关系
| 相关模块 | 关系 |
|---|
| buddy allocator | CMA 不是绕开伙伴系统,而是在它之上提前保住更可能成功的大块连续物理页来源。 |
| DMA 与设备路径 | 很多真正推动 CMA 存在的需求,来自设备对连续物理内存的严格要求。 |
| vmalloc | 两者正好帮助你分清“CPU 想看起来连续”和“设备真的要物理连续”这两类问题。 |
| 页迁移与回收 | 预留区平时能否借用、需要时能否清回来,和可迁移性、回收整理能力关系很深。 |
读完这页后,你应该能回答
- 为什么 CMA 真正解决的是“长期保住连续物理内存机会”,而不是简单多试几次分配?
- 为什么它和 vmalloc 虽然都常出现在“大块内存”讨论里,但解决的根本不是同一类连续性?
- 为什么 CMA 往往要结合 buddy allocator、DMA 需求和页迁移一起理解?
后面适合继续问:哪些设备需求最容易长成 CMA 问题?为什么平时可借用、需要时能清回这件事并不容易?如果系统里很多不可迁移内容早早压住这片区域,会发生什么?