分享

kzalloc函数

 hutashenzhou 2013-07-10

  这个函数就是原来的两个函数的整合 , 即原来我们每次申请内存的时候都会这么做 , 先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化, 而现在省事了 , 一步到位 , 直接调用 kzalloc(), 效果等同于原来那两个函数 , 所有申请的元素都被初始化为 0. 其实对写驱动的来说 , 知道现在应该用kzalloc() 代替原来的 kmalloc() 和 memset() 就可以了 , 这是内核中内存管理部分做出的改变 , 确切的说是改进 , 负责内存管理那部分的兄弟们的目标无非就是让内核跑起来更快一些 , 而从 kmalloc/memset 到 kzalloc 的改变确实也是为了实现这方面的优化。

kmalloc 原型是:

#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 告知分配器立即放弃如果得不到请求的内存.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多