ICode9

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

kmalloc函数详解

2020-01-20 18:07:45  阅读:427  来源: 互联网

标签:__ kmalloc 函数 GFP unsigned 详解 内存 分配


在做驱动开发时,经常会使用到的kmalloc函数进行内存的分配,下面对kmalloc在内核上的语言集进行相关的解释。

一、kmalloc 函数的原型:
#include <linux/slab.h>
void *kmalloc(size_t size, int flags);

参数:
    kmalloc 的第一个参数是要分配的块的大小,第二个参数是分配标志。

size 参数:
用户空间malloc 是基于堆内存分配,内核负责管理系统物理内存,物理内存只能按页面进行分配,因此,kmalloc是基于页进行分配。另外需要注意的一点是内核只能分配一些预定义的、固定            大小的字节数组。kmalloc 可以处理的最小的内存块是32或64,最大分配的内存大小为128K。

flags参数:

GFP_KERNEL 
内核内存的通常分配方法,可能会引起休眠。

GFP_USER 
用于为用户空间分配内存,可能会休眠。

GFP_ATOMIC 
用于在中断处理例程或其他运行于进程上下文之外的代码中分配内存,不会休眠。

GFP_HIGHUSER
用于为用户空间分配内存,指高端内存分配,可能会休眠。

GFP_NOIO
禁止任何I/O的初始化(主要在虚拟内存代码中使用)。

GFP_NOFS
分配不允许执行任何文件系统调用(主要在文件系统代码中使用)。

****************************************************************
分割线以上的flag可以和分割线以下的flag “或”起来使用
****************************************************************

__GFP_DMA
该标志请求分配发生在可进行DMA的内存区段中。

__GFP_HIGHMEM
该标志表明要分配的内存可位于高端内存。

__GFP_NOWAPN 
该标志使用的次数较少,它主要是避免内核在无法满足分配请求时产生警告信息。

__GFP_COLD
该标志表示请求尚未使用的“冷”页面。

__GFP_HIGH 
该标记标记了一个高优先级的请求,它允许为紧急状况而消耗由内核保留的最后一些页面。

__GFP_REPEAT
该标志表示在分配器在满足分配请求而遇到困难时,“努力再尝试一次”,它会重新尝试分配,但还是有失败的可能性。

__GFP_NOFAIL
该标志表示在分配器在满足分配请求而遇到困难时告诉分配器始终不返回失败。

__GFP_NORETRY
该标志表示再请求内存不可获得的时候会立即返回。

GFP_前缀是由于在分配内存时总是调用get_free_page来实现实际的分配而得来的缩写。

二、关于的get_free_page 和相关函数有以下:

get_zeroed_page(unsigned int flags);
返回指向新页面的指针,并将页面清零。

__get_free_page(unsigned int flags);
与 get_zeroed_page(unsigned int flags)类似,但是不清零页面。

__get_free_pages(unsigned int flags, unsigned int order);
分配若干(物理连续)页面,并且返回指向该区域第一个字节的指针,但是对于页面不进行清零。

当程序不需要使用页面时,可以使用以下两个函数中的一个进行的释放,第一个函数是宏,展开后是对第二个函数的调用:   
void free_page(unsigned long addr);
void free_pages(unsigned long addr, unsigned long order);

以上就是我个人认为kmalloc一些有用信息的提取,至于关于页的详细说明,以后给大家分享。

欢迎大家进行补充交流。

标签:__,kmalloc,函数,GFP,unsigned,详解,内存,分配
来源: https://www.cnblogs.com/Senchuangdianzi/p/12215376.html

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

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

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

ICode9版权所有