这次来说一个关键函数,kmalloc()函数。
函数原型
#include Linux/slab.h>
void *kmalloc(size_t size, int flags);
size是要分配内存的大小,不过内核会对大小进行适配,比如取32,64等等,是和缓存行等体系结构有关系的,总之可能会比你要申请的内存大一些。
flags是与伙伴系统交互的标记,虽说kmalloc()是从slab分配内存,不过底层还是要和伙伴系统交互的。
我们来看一下这些标记:
flags | 含义 |
---|---|
GFP_ATOMIC | 用来从中断处理和进程上下文之外的其他代码中分配内存,从不睡眠 |
GFP_KERNEL | 内核内存的正常分配,可能睡眠 |
GFP_USER | 用来为用户空间页分配内存,可能睡眠 |
GFP_HIGHUSER | 类似GPR_USER,但是是从高端内存分配。 |
GFP_NOIO | 类似GFP_KERNEL,禁止任何文件系统调用 |
GFP_NOFD | 类似GFP_KERNEL,禁止任何I/O初始化 |