http://blog.csdn.net/daydring/article/details/36670007

#include <linux/slab.h> void *kmalloc(size_t size, int flags);

给 kmalloc 的第一个参数是要分配的块的大小. 第 2 个参数, 分配标志, 非常有趣, 因为它以几个方式控制 kmalloc 的行为.

最一般使用的标志, GFP_KERNEL, 意思是这个分配((内部最终通过调用 __get_free_pages 来进行, 它是 GFP_ 前缀的来源) 代表运行在内核空间的进程而进行的. 换句话说, 这意味着调用函数是代表一个进程在执行一个系统调用. 使用 GFP_KENRL 意味着 kmalloc 能够使当前进程在少内存的情况下睡眠来等待一页. 一个使用 GFP_KERNEL 来分配内存的函数必须, 因此, 是可重入的并且不能在原子上下文中运行. 当当前进程睡眠, 内核采取正确的动作来定位一些空闲内存, 或者通过刷新缓存到磁盘或者交换出去一个用户进程的内存.

GFP_KERNEL 不一直是使用的正确分配标志; 有时 kmalloc 从一个进程的上下文的外部调用. 例如, 这类的调用可能发生在中断处理, tasklet, 和内核定时器中. 在这个情况下, 当前进程不应当被置为睡眠, 并且驱动应当使用一个 GFP_ATOMIC 标志来代替. 内核正常地试图保持一些空闲页以便来满足原子的分配. 当使用 GFP_ATOMIC 时, kmalloc 能够使用甚至最后一个空闲页. 如果这最后一个空闲页不存在, 但是, 分配失败.

其他用来代替或者增添 GFP_KERNEL 和 GFP_ATOMIC 的标志, 尽管它们 2 个涵盖大部分设备驱动的需要. 所有的标志定义在 <linux/gfp.h>, 并且每个标志用一个双下划线做前缀, 例如 __GFP_DMA. 另外, 有符号代表常常使用的标志组合; 这些缺乏前缀并且有时被称为分配优先级. 后者包括:

GFP_ATOMIC

用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.

GFP_KERNEL

内核内存的正常分配. 可能睡眠.

GFP_USER

用来为用户空间页来分配内存; 它可能睡眠.

GFP_HIGHUSER

如同 GFP_USER, 但是从高端内存分配, 如果有. 高端内存在下一个子节描述.

GFP_NOIO

GFP_NOFS

这个标志功能如同 GFP_KERNEL, 但是它们增加限制到内核能做的来满足请求. 一个 GFP_NOFS 分配不允许进行任何文件系统调用, 而 GFP_NOIO 根本不允许任何 I/O 初始化. 它们主要地用在文件系统和虚拟内存代码, 那里允许一个分配睡眠, 但是递归的文件系统调用会是一个坏注意.

上面列出的这些分配标志可以是下列标志的相或来作为参数, 这些标志改变这些分配如何进行:

__GFP_DMA

这个标志要求分配在能够 DMA 的内存区. 确切的含义是平台依赖的并且在下面章节来解释.

__GFP_HIGHMEM

这个标志指示分配的内存可以位于高端内存.

__GFP_COLD

正常地, 内存分配器尽力返回"缓冲热"的页 -- 可能在处理器缓冲中找到的页. 相反, 这个标志请求一个"冷"页, 它在一段时间没被使用. 它对分配页作 DMA 读是有用的, 此时在处理器缓冲中出现是无用的. 一个完整的对如何分配 DMA 缓存的讨论看"直接内存存取"一节在第 1 章.

__GFP_NOWARN

这个很少用到的标志阻止内核来发出警告(使用 printk ), 当一个分配无法满足.

__GFP_HIGH

这个标志标识了一个高优先级请求, 它被允许来消耗甚至被内核保留给紧急状况的最后的内存页.

__GFP_REPEAT

__GFP_NOFAIL

__GFP_NORETRY

这些标志修改分配器如何动作, 当它有困难满足一个分配. __GFP_REPEAT 意思是" 更尽力些尝试" 通过重复尝试 -- 但是分配可能仍然失败. __GFP_NOFAIL 标志告诉分配器不要失败; 它尽最大努力来满足要求. 使用 __GFP_NOFAIL 是强烈不推荐的; 可能从不会有有效的理由在一个设备驱动中使用它. 最后, __GFP_NORETRY 告知分配器立即放弃如果得不到请求的内存.

kmalloc 能够分配的内存块的大小有一个上限. 这个限制随着体系和内核配置选项而变化. 如果你的代码是要完全可移植, 它不能指望可以分配任何大于 128 KB. 如果你需要多于几个 KB, 但是, 有个比 kmalloc 更好的方法来获得内存, 我们在本章后面描述.

这方面的原因:

kmalloc并不直接从分页机制中获得空闲页面而是从slab页面分配器那儿获得需要的页面,slab的实现代码限制了最大分配的大小为128k,即131072bytes,理论上你可以通过更改slab.c中的 cache_sizes数组中的最大值使得kmalloc可以获得更大的页面数,不知道有没有甚么副效应或者没有必要这样做,因为获取较大内存的方法有很多,想必128k是经验总结后的合适值。

alloc_page( )可以分配的最大连续页面是4M吧。MAX_ORDER =10

46 static inline struct page * alloc_pages(unsigned int gfp_mask, unsigned int order) 
47 { 
48 /* 
49 * Gets optimized away by the compiler. 
50 */ 
51 if (order >= MAX_ORDER) 
52 return NULL; 
53 return _alloc_pages(gfp_mask, order); 
54 } 
alloc_pages最大分配页面数为512个,则可用内存数最大为2^9*4K=2M

kmalloc参数GFP_ATOMIC or GFP_KERNEL?相关推荐

  1. Kmalloc参数详解

    Kmalloc参数详解 Void *kmalloc(size_t size, int flags); 第一个参数是要分配的块的大小,第二个参数是分配标志(flags),他提供了多种kmalloc的行为 ...

  2. GFP_ATOMIC or GFP_KERNEL 区别

    本文转载至:http://lists.metaprl.org/pipermail/cs134-labs/2002-October/000025.html The short (or kinda lon ...

  3. malloc与kmalloc

    在设备驱动程序中动态开辟内存,不是用malloc,而是kmalloc,或者用get_free_pages直接申请页.释放内存用的是kfree,或free_pages. 对于提供了MMU(存储管理器,辅 ...

  4. Linux设备驱动-kmalloc

    Linux驱动开发中申请内存经常用到kmalloc函数,函数原型如下: #include <linux/slab.h> void *kmalloc(size_t size, int fla ...

  5. linux 内核空间 sy,在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysf...

    级别: 初级 燚 杨 (), 计算机科学硕士 2006 年 2 月 16 日 本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数.模块参数 ...

  6. Linux 内核中用 GFP_ATOMIC 申请内存究竟意味着什么?

    作者 | 宋宝华  责编 | 张文 头图 | CSDN 下载自东方 IC 来源 | Linux阅码场(ID:LinuxDev) 本文目的:本文补充校正一些 Linux 内核开发者关于 GFP_ATOM ...

  7. 宋宝华:Linux内核中用GFP_ATOMIC申请内存究竟意味着什么?

    本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内 ...

  8. linux电容触摸屏驱动参数,基于FT5x06嵌入式Linux电容触摸屏驱动

    **************************************************************************************************** ...

  9. linux kmalloc 函数

    作用:内核分配连续物理内存的接口函数,在虚拟地址空间上也是连续的. 与vmalloc的比较: 相同点:都是用于内核空间内存分配,对应的虚拟地址空间连续,且按字节为单位. 异同点:kmalloc分配的物 ...

  10. ip_vs实现分析(7)

    本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途. msn: yfydz_no1@hotmail.com 来源:http:/ ...

最新文章

  1. 区块链+能源,能擦出什么样的火花?
  2. SimCSE:用于句子嵌入的对比学习
  3. 职业生涯第二年回顾(2011.2~2012.2)
  4. oracle中primary,oracle中如何 Primary key自增
  5. python object has no attribute_如何修复python中的“AttributeError:type object has no attribute”?...
  6. OpenCV多目标跟踪与视频分析
  7. 喜欢去知乎炸鱼?用python吧
  8. 带你掌握Redis数据类型:string和Hash
  9. 优秀常用网站汇总.txt
  10. Xilinx产品与及开发工具2017
  11. Angular官方教程采坑
  12. 英文单词 modal 模态,flex里取模糊之意
  13. 正确的python变量名_Python变量的命名
  14. 互动媒体技术专题2——多视角认识十二个“一” 技术预演与方案设计
  15. 中职计算机教师发言范文话,中职班主任发言稿范文(精选4篇)
  16. echarts瀑布图_Echarts自定义瀑布图开发
  17. 在ipad上播放flash大集合
  18. 大数据周会-本周学习内容总结05
  19. jsp实验中:tag文件报java.util.ArrayList cannot be cast to java.lang.String
  20. php燕十八作业,布尔教育燕十八PHP基础巩固视频教程的源码分享

热门文章

  1. vs2015环境搭建与简单程序测试
  2. mysql 1067
  3. poj 2406 Power Strings(KMP)
  4. DOS及BIOS中断调用实验
  5. asp:树型select菜单
  6. 8-C++远征之继承篇-学习笔记
  7. CUDA入门(六) 异步并行执行解析
  8. 绿色版Tomcat的配置
  9. 自动生成数据同步存储过程的存储过程
  10. WCF开发之消息契约(MessageContract)