kmalloc vmalloc kzalloc malloc 和 get_free_page()【转】

简介:

转自:http://blog.csdn.net/hbhhww/article/details/7236695

kmalloc vmalloc kzalloc get_free_page()是内核空间申请内存空间函数

malloc是用户空间申请内存函数

 

一 ,kmalloc() 与 kfree()  和get_free_page的区别

1,用于申请较小的、连续的物理内存:使用的是内存分配器slab一小片。申请的内存位于物理内存的映射区域。其正真的物理地址只相差一个固定的偏移。

   可以用这两个宏来简单转换 __pa(address)  {virt_to_phys()} 和  __va(address){phys_to_virt()}

   get_free_page()申请的内存是一整页,一页的大小一般是128K。它们的区别只有这一点不同,其它的都相同。

   本质上讲,kmalloc()和get_free_page()最终调用实现都是相同的,只不过在调用最终函数时所传的flag不同而以。

2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上也是连续

3. gfp_mask标志:

情形                                                  相应标志
进程上下文,可以睡眠                  GFP_KERNEL
进程上下文,不可以睡眠               GFP_ATOMIC
中断处理程序                            GFP_ATOMIC
软中断                                    GFP_ATOMIC
Tasklet                                  GFP_ATOMIC
用于DMA的内存,可以睡眠         GFP_DMA | GFP_KERNEL
用于DMA的内存,不可以睡眠     GFP_DMA | GFP_ATOMIC

4. void kfree(const void *ptr)

释放由kmalloc()分配出来的内存块

二,vmalloc() 与 vfree()

用于申请较大的内存空间,虚拟内存是连续的:申请内存位于vmalloc_start -----vmalloc_end之间,与物理内存没有简单的转换关系。物理上不要求连续。

1. 以字节为单位进行分配,在<linux/vmalloc.h>中

2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续,物理地址不连续

3. 一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU之外,根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用kmalloc(),而只有在需要获得大块内存时才使用vmalloc(),例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc()分配的内存上。

4.void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。

三,malloc(), vmalloc()和kmalloc()区别

[1]kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存

[2]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc和vmalloc一样,也是虚连,物理不一定连。

[3]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大

[4]内存只有在要被DMA访问的时候才需要物理上连续

[5]vmalloc比kmalloc要慢

 

四,kzalloc

kzalloc实现了kmalloc以及memset的功能,一个函数起到了两个函数的作用

 

五,目前kzalloc将取代kmalloc和memset功能。

 以后在内核,看到此函数的比率将会更高。













本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4825960.html,如需转载请自行联系原作者

相关文章
|
4月前
|
存储 C语言
malloc
【6月更文挑战第16天】
47 8
|
4月前
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
92 1
|
4月前
|
C语言
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
51 0
|
4月前
|
程序员 C语言
C语言内存管理:malloc、calloc、realloc与free函数详解
C语言内存管理:malloc、calloc、realloc与free函数详解
|
4月前
|
缓存 C语言
glibc函数malloc的工作原理
glibc函数malloc的工作原理
28 0
|
5月前
|
存储 安全 编译器
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
44 0
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
|
5月前
|
程序员 编译器 C语言
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(下)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
38 0
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(下)
|
4月前
|
C语言
malloc()函数
`malloc()`是C语言中的动态内存分配函数,用于分配指定大小的内存块,并返回一个`void*`类型的指针。要包含`stdlib.h`头文件来使用它。分配的内存大小以字节为单位,成功则返回内存首地址,失败则返回`NULL`。需要注意的是,返回的指针需强制转换为所需类型,并在使用后用`free()`释放内存,避免内存泄漏。切勿在分配区域内移动指针,以防止释放时出现问题。
|
5月前
|
程序员 编译器 C语言
【C语言】动态内存管理(malloc,free,calloc,realloc)-- 详解
【C语言】动态内存管理(malloc,free,calloc,realloc)-- 详解
|
5月前
|
C语言 C++
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(中)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
35 0