在做驱动开发时,经常会使用到的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一些有用信息的提取,至于关于页的详细说明,以后给大家分享。
欢迎大家进行补充交流。