> 文章列表 > Linux内存管理(三十三):vmalloc 详解

Linux内存管理(三十三):vmalloc 详解

Linux内存管理(三十三):vmalloc 详解

源码基于:Linux 5.4

 

 

0. 前言

kmalloc()、vmalloc()、malloc() 这三个函数是常用的内存分配函数,但有着本质的区别。

kmalloc() 基于slab 分配器,是建立在一个物理地址连续的大内存块上,所以 kmalloc() 分配的内存物理是上连续的,而且 kmalloc() 映射的虚拟内存在线性区域,也是连续的。详细可以查看《slub 分配器之kmem_cache_alloc》一文第 5.1.2 节。

相比于 kmalloc(),vmalloc() 实现是为了虚拟内存连续,而物理内存可以不用连续。另外,vmalloc() 申请内存的过程中可以睡眠,因此不能用于中断上下文中。

 

1. vmalloc()

mm/vmalloc.cvoid *vmalloc(unsigned long size)
{return __vmalloc_node_flags(size, NUMA_NO_NODE, GFP_KERNEL);
}
EXPORT_SYMBOL(vmalloc);

最终调用 __vmalloc_node_flags(),这里的 gfp_mask 为 GFP_KERNEL。

mm/vmalloc.cstatic inline void *__vmalloc_nod