Linux 内核 vmalloc 虚拟内存分配器深度工程实战:从 VMA 分配到页表填充的完整链路
引言
内核中并非所有内存分配都需要物理连续。当模块代码需要加载、I/O 缓冲区需要大块非连续映射、或者 per-CPU 动态区域需要创建时,vmalloc 系列函数便成为不可或缺的工具。
一、vmalloc 的地址空间组织
1.1 vmalloc 区在虚拟地址空间中的位置
vmalloc 区位于内核虚拟地址空间的特定范围,典型起始地址为 0xFFFFC90000000000。
二、vm_struct 结构
每个 vmalloc 分配的内核区域都由 vm_struct 结构体描述,包含 addr、size、pages、nr_pages 等关键字段。
三、__vmalloc_node_range 分配核心路径
vmalloc 的完整调用链路包括:alloc_vmap_area 查找空闲虚拟地址区间,伙伴系统逐页分配物理页,vmap_pages_range_noflush 填充多级页表。
四、TLB 开销与性能工程
vmalloc 完成后必须发送 TLB shootdown 广播。vmalloc vs kmalloc 在不同大小下性能差距约 5-7 倍。
五、实战调优与排查
排查 vmalloc 分配失败的方法包括:查看 /proc/vmallocinfo,检查 Vmalloc 区统计信息。优化包括使用 __GFP_NOWARN 避免重试风暴、预映射大页、缓存对齐分配等。

发表评论 取消回复