转自: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功能。

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

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

  1. Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc

    我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free(). 注意:动态申请的内存使用完后必须要释放,否则会造成内 ...

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

    转自:http://www.th7.cn/system/lin/201606/167750.shtml 我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一 ...

  3. kmalloc、vmalloc、malloc的区别

    简单的说: kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc ...

  4. Memory Allocation API In Linux Kernel && Linux Userspace、kmalloc vmalloc Difference、Kernel Large Section Memory Allocation

    目录 . 内核态(ring0)内存申请和用户态(ring3)内存申请 . 内核态(ring0)内存申请:kmalloc/kfree.vmalloc/vfree . 用户态(ring3)内存申请:mal ...

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

    /*********************************************************************************** * * alloc_pages ...

  6. linux中的内存申请函数的区别 kmalloc, vmalloc

    kmalloc是返回连续内存的内存分配函数 vmalloc是返回较大内存空间的,不需要连续的内存分配函数.其速度较慢,并且不能在中断上下文调用.

  7. LInux设备驱动分析—— kmalloc和kzalloc函数

    今晚在研究EVM5728开发板上面Linux系统的IIC设备驱动程序,偶然之间看到驱动程序中有一处使用了kzalloc函数,本人之前都是使用Linux内核提供的kmalloc / kfree函数来给设 ...

  8. 内核中的内存申请:kmalloc、vmalloc、kzalloc、get_free_pages 之间的区别

    kmalloc   vmalloc   kzalloc   get_free_page()是内核空间申请内存空间函数 malloc是用户空间申请内存函数 一 ,kmalloc() 与 kfree()  ...

  9. linux内存管理之malloc、vmalloc、kmalloc的区别

    kmalloc kzalloc vmalloc malloc 和get_free_page()的区别 一.简述 1. kmalloc申请的是较小的连续的物理内存,虚拟地址上也是连续的.kmalloc和 ...

随机推荐

  1. Leetcode 20.有效的括号 By Python

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  2. 自学Linux Shell14.2-在脚本中使用其他文件描述符

    点击返回 自学Linux命令行与Shell脚本之路 14.2-在脚本中使用其他文件描述符 在脚本中重定向输入和输出,并布局限于以上讲的3个默认的文件描述符,shell最多可以有9个打开的文件描述符.这 ...

  3. android 让真机显示 DeBug Log调试信息

    真机默认是不开启Log 开关的,这么来说我们如果使用真机来搞程序测试的话,需要做以下几个步骤: 下面以华为手机为例开启手机的log功能:  1.在拨号界面输入:*#*#2846579#*#*  进入测 ...

  4. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  5. luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)

    带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...

  6. virtualenv 包管理

    创建虚拟环境: 1) pip install virtualenv 2) virtualenv  DemoEnv(虚拟环境名) 3) 此处windows和linux不同系统下的文件结构略有不同 lin ...

  7. Mysql的命令总结

    Mysql常用命令 启动 net start mysql 关闭 net stop mysql 连接mysql mysql -uroot -ppssword mysql -uroot -P3307 -p ...

  8. 循环viewpager

    如果viewpager listadapter小于三个.用这个移除异常. for (View view : viewList) {             ViewGroup p = (ViewGro ...

  9. POSIX 线程取消点的 Linux 实现

    http://blog.csdn.net/stevenliyong/article/details/4364039 原文链接:http://blog.solrex.cn/articles/linux- ...

  10. [luogu1655][小朋友的球]

    luogu1665 思路 一道第二类斯特兰数的模板题.只不过需要写个高精. f[i][j]表示前i个球放到j个盒子里的方案数.第i个球可以单独一个盒子,所以f[i][j]+=f[i-1][j-1].还 ...