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功能。

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

时间: 2024-09-22 03:05:13

kmalloc vmalloc kzalloc malloc 和 get_free_page()【转】的相关文章

Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别【转】

转自:http://www.th7.cn/system/lin/201606/167750.shtml 我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free().注意:动态申请的内存使用完后必须要释放,否则会造成内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃. 那么,在内核空间中如何申请内存呢?一般我们会用到 kmalloc().kzalloc().vmalloc() 等,下面我们介绍一下这些函数的使

Samsung_tiny4412(驱动笔记09)----alloc_pages,kmalloc,vmalloc,kmem_cache,class

/*********************************************************************************** * * alloc_pages,kmalloc,vmalloc,kmem_cache,class * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 本文中有些源代码没有全部帖出来,主要是因为篇幅太大的原因; * 3. 基于2中的原因,本文借鉴

uclinux-2008R1-RC8(bf561)到VDSP5的移植(44):kmalloc和kzalloc的问题

这两个函数的定义均在include/linux/slab_def.h中,其实现如下: static inline void *kmalloc(size_t size, gfp_t flags){ if (__builtin_constant_p(size)) { int i = 0;#define CACHE(x) / if (size <= x) / goto found; / else / i++;#include "kmalloc_sizes.h"#undef CACHE

内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】

转自:http://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcalloc.get_free_pages;当然,设备驱动程序也不例外;对于提供了MMU功能的处理器而言,Linux提供了复杂的内存管理系统,使得进程所能访问到的地址空间可以达到4GB;而这4GB的空间又被划分为两个部分:0GB~3GB(PAGE_OFFSET,x86中的值是0xC0000000)的区域被

Kmalloc和Vmalloc的区别

kmalloc()和vmalloc()介绍kmalloc()用于申请较小的.连续的物理内存1. 以字节为单位进行分配,在<linux/slab.h>中2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上自然连续3. gfp_mask标志:什么时候使用哪种标志?如下:--------------------------------情形 相应标志--------------------------------进程上下文,可以睡眠 G

Linux内存管理【转】

转自:http://www.cnblogs.com/wuchanming/p/4360264.html 转载:http://www.kerneltravel.net/journal/v/mem.htm Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理

Linux内存管理 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4491368.html Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理. 前言 内存管理一向是所有操作系统书

Linux内存管理

转载:http://www.kerneltravel.net/journal/v/mem.htm Linux内存管理 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理. 前言 内存管理一向是所有操作系统书籍不惜笔墨重点讨论

关于用strace工具定位vrrpd进程有时会挂死的bug

只做工作总结备忘之用. 正在烧镜像,稍总结一下进来改bug遇到的问题.     一个项目里要用到L3 switch的nat,vrrp功能,但实地测试中偶然出现write file挂死的情况,但不是必现.交付在即,于是加调试信息,反复跑配置的脚本,定位bug.   一,期初怀疑是vtysh与vrrpd进程通信出现阻塞(现象即是系统挂死). (1)因为在跑配置脚本时,出现了enable命令也挂死的情况,所以这么怀疑: (2)在vrrpd与vtysh命令传输的关键点加打印信息(注意vrrpd不要-d