ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

gfp_mask

2021-11-05 12:01:08  阅读:179  来源: 互联网

标签:__ 标志 gfp 修饰符 mask 分配 分配器 GFP


  我们已经看过了几个例子,发现不管是在低级页分配函数中,还是在kmalloc()中,都用到了分配器标志。现在,我们就深入讨论一下这些标志。

  这些标志可以分为三类:行为修饰符、区修饰符及类型。行为修饰符表示内核应当如何分配所需的内存。在某些特定情况下,只能使用某些特定的方法分配内存。例如,中断处理程序就要求内核在分配内存的过程中不能睡眠(因为中断处理程序不能睡眠)。区修饰符表示从哪儿分配内存。前面我们已经看到,内核把物理内存分为多个区,每个区用于不同的目的。区修饰符指明到底从这些区中的哪一个区中进行分配。类型标志组合了行为修饰符和区修饰符,将各种可能用到的组合归纳为不同的类型,简化了修饰符的使用;这样,你只需指定一个类型标志就可以了。GFP_KERNEL就是一种类型标志,内核中进程上下文相关代码可以使用它。我们来看一下这些标志。

  1、行为修饰符

  所有这些标志,包括行为描述符都是在<linux/gfp.h>中声明的。不过,在<linux/slab.h>中包含有这个头文件,因此,你一般不必直接包含引用它。实际上,一般只使用类型修改符就够了,我们随后会看到这点。因此,最好对每个标志都有所了解。如下:

标志 描述
__GFP_WAIT 分配器可以睡眠
__GFP_HIGH 分配器可以访问紧急事件缓冲池
__GFP_IO 分配器可以启动磁盘I/O
__GFP_FS 分配器可以启动文件系统I/O
__GFP_NOWARN 分配器不打印失败警告
__GFP_REPEAT 分配器在分配失败时重复进行分配,但是这个分配还存在失败的可能
__GFP_NOFAIL 分配器将无限地进行重复分配。分配不能失败
__GFP_NORETRY 分配器在分配失败时绝不会重新分配
__GFP_NO_GROW 有slab层内部使用
__GFP_COMP 添加混合页数据,在bugetlb的代码内部使用

  可以同时指定这些分配标志。例如:

ptr = kmalloc(size, __GFP_WAIT | __GFP_IO | __GFP_FS);

  说明也分配器(最终调用alloc_pages())在分配时可以阻塞、执行I/O,在必要时还可以执行文件系统操作。这就让内核有很大的自由度,以便它尽可能找到空闲的内存来满足分配要求。

标签:__,标志,gfp,修饰符,mask,分配,分配器,GFP
来源: https://www.cnblogs.com/lc0811/p/15512539.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有