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

源码基于:Linux 5.4

0. 前言

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

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

相比于 kmalloc(),vmalloc() 实现是为了虚拟内存连续,而物理内存可以不用连续。正是因为物理内存不连续,而虚拟内存需要连续,所以,需要对每一个页进行映射,因此vmalloc() 的效率不是很高,只会在不得已的时候使用(例如,需要使用大内存)。另外,vmalloc() 申请内存的过程中可以睡眠,因此不能用于中断上下文中。

相对于上面两个函数,malloc() 是用户层的内存分配函数,最终会通过 brk() 和 mmap() 进行系统调用。

1. vmalloc 初始化

init/main.c

static vo

猜你喜欢

转载自blog.csdn.net/jingerppp/article/details/130194482
今日推荐