vmalloc 与内核虚拟连续映射

这页讲的是:有些内核数据结构希望自己看到的是一大片连续地址,但底层物理页未必真能连续拿出来。学这页的重点,是理解 vmalloc 解决的是“虚拟地址连续”,不是“物理地址连续”,它是在地址映射层给内核腾出更灵活的组织空间。

这块是什么

vmalloc 与内核虚拟连续映射,讲的是 Linux 如何把多页物理上不连续的内存,通过页表映射成一段对内核来说连续可用的虚拟地址区域。它关注的是“内核自己用起来是不是一整段顺手地址”,而不是去硬凑一大片连续物理内存。

可以把它理解成:仓库里的货物可能散落在不同库位,但你可以在总控台上给它们编成一条连续货架编号。对管理者来说,这条编号是连着的;至于后面真实货位是不是挨着,并不重要。

它负责什么

提供虚拟连续区域

  • 让内核代码能把一片较大区域当连续地址来使用
  • 不要求底层物理页真的连成一大块
  • 缓解高阶物理连续分配的压力
  • 把地址便利性和物理现实拆开处理

承接较大但不必物理连续的需求

  • 适合一些规模较大、寿命较长的数据结构
  • 比直接硬要大块连续物理页更现实
  • 让某些大区域分配不必过度依赖伙伴系统高阶块
  • 给内核提供另一条大块组织路径

在页表层做组织

  • 通过映射把散页拼成连续虚拟视图
  • 强调地址空间管理而不只是页库存
  • 让内核能利用虚拟地址这层抽象来避开部分碎片压力
  • 把“连续”从物理问题转成映射问题

为什么它不是“更高级的大块分配”

如果想得太简单会怎样真正关键在哪
觉得 vmalloc 只是更好用的大内存接口会忽略它和 kmalloc / buddy allocator 的连续性语义完全不同。它给的是虚拟连续,不是物理连续。
把它当 DMA 缓冲来源容易在需要设备物理可达性的地方走错路。很多设备路径关心的仍是物理连续或可映射规则,而不是虚拟顺手。
只看能不能拿到大区域会漏掉额外页表开销、地址转换成本和访问特性差异。它用灵活性换来额外映射管理成本。
觉得它能替代所有页级分配会混淆地址组织问题和物理页供应问题。底层物理页还是要先存在,只是无需挨在一起。

关键概念

概念现在怎么理解
vmalloc把物理散页映射成内核虚拟连续地址区的一类分配方式。
虚拟连续从内核代码视角看,地址是一整段连续的。
物理不连续底层真正承载这段区域的页,不要求彼此挨着。
页表映射把多张散页组织成连续虚拟视图的关键机制。
地址便利性某些场景真正想要的是“好用的一整段地址”,不一定非要硬件眼里的连续物理块。

为什么重要

常见误解

它不负责什么

和其他模块的关系

相关模块关系
buddy allocatorvmalloc 仍要先拿到若干底层页,只是不用这些页彼此物理相邻。
页表与地址空间它的核心价值正是借助页表把散页拼成连续虚拟区域。
DMA / CMA这两类更强调设备侧约束和物理连续性,恰好能帮助你看清 vmalloc 的边界。
大内核数据结构某些仅供 CPU 使用、追求地址便利的大对象区域更容易长成 vmalloc 问题。

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

后面适合继续问:什么时候一个需求更像 vmalloc 问题,而不是 kmalloc 或 DMA 问题?为什么“CPU 看着连续”和“设备能顺手访问”是两回事?如果系统虚拟地址空间本身紧张,会怎样反过来影响 vmalloc?