Linux驱动开发中申请内存经常用到kmalloc函数,函数原型如下:
#include <linux/slab.h>
void *kmalloc(size_t size, int flags);
1.size参数
size,需要分配的的memory的大小。 kmalloc 能够处理的最小分配是 32 或者 64 字节,依赖系统的体系所使用的页大小。kmalloc 能够分配的内存块的大小有一个上限. 这个限制随着体系和内核配置选项而变化。如果你的代码是要完全可移植,它不能指望可以分配任何大于 128 KB。
2.flag参数
flag,用于控制kmalloc的行为:
GFP_KERNEL // 分配一片连续的内存,可能睡眠,故不能在中断函数中使用
GFP_ATOMIC // 用来从中断处理和进程上下文之外的其他代码中分配内存,从不睡眠。如果没有足够的空闲页,则返回失败
GFP_USER // 用来为用户空间页来分配内存; 它可能睡眠.
GFP_HIGHUSER // 如同 GFP_USER, 但是从高端内存分配, 如果有
__GFP_DMA // 这个标志要求分配在能够 DMA 的内存区
__GFP_HIGHMEM // 这个标志指示分配的内存可以位于高端内存
__GFP_HIGH // 这个标志标识了一个高优先级请求, 它被允许来消耗甚至被内核保留给紧急状况的最后的内存页