kmalloc、vmalloc、malloc的区别与联系
kmalloc、vmalloc、malloc的区别与联系
概要
- kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
- kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续
- kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
- 内存只有在要被DMA访问的时候才需要物理上连续
- 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仅在不得已时才会使用——典型的就是为了获得大块内存时。
参考资料: