kmalloc、vmalloc、malloc的区别与联系

概要

  1. kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
  2. kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续
  3. kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
  4. 内存只有在要被DMA访问的时候才需要物理上连续
  5. vmalloc比kmalloc要慢

kmalloc

kmalloc()函数与用户空间的malloc()一族函数非常相似,只不过它多了一个flags参数(对于flags的详细内容,会在下一节中介绍)。kmalloc()函数是一个简单的接口,用它可以获得以字节为单位的一块内核内存。
kmalloc()在include/linux/slab.h中声明:
void *kmalloc(size_t size, gfp_t flags)

这个函数返回一个指向内存块的指针,其内存块至少要有size大小。所分配的内存区在物理上是连续的。

gfp_mask标志

gfp_mask标志即为分配器标志,在你编写的绝大多数代码中,用到的要么是GFP_KERNEL,要么是GFP_ATOMIC。下表是通常情形和所用标志的列表。不管使用哪种分配类型,你都要进行检查,并对错进行处理。

情形 相应标志
进程上下文,可以睡眠 使用GFP_KERNEL
进程上下文,不可以睡眠 使用GFP_ATOMIC
中断处理程序 使用GFP_ATOMIC
软中断 使用GFP_ATOMIC
tasklet 使用GFP_ATOMIC

vmalloc

vmalloc()函数的工作方式类似于kmalloc(),只不过vmalloc分配的内存虚拟地址是连续的,而物理地址则无须连续。vmalloc函数为了把物理上不连续的页转换为虚拟地址空间上连续的页,必须专门建立页表项。vmalloc仅在不得已时才会使用——典型的就是为了获得大块内存时。


参考资料:

  1. csdn macrossdzh