函数原型
#include Linux/slab.h>
void *kmalloc(size_t size, int flags);
size是要分配内存的大小,不过内核会对大小进行适配,比如取32,64等等,是和缓存行等体系结构有关系的,总之可能会比你要申请的内存大一些。
flags是与伙伴系统交互的标记,虽说kmalloc()是从slab分配内存,不过底层还是要和伙伴系统交互的。
flags标记:
上面这些标志底层是组合了下面这些标志实现的:
__GFP_DMA
这个标志要求分配在能够 DMA 的内存区. 确切的含义是平台依赖
__GFP_HIGHMEM
这个标志指示分配的内存可以位于高端内存.
__GFP_COLD
正常地, 内存分配器尽力返回”缓冲热”的页 – 可能在处理器缓冲中找到的页. 相反, 这个标志请求一个”冷”页, 它在一段时间没被使用. 它对分配页作 DMA 读是有用的, 此时在处理器缓冲中出现是无用的.
__GFP_NOWARN
这个很少用到的标志阻止内核来发出警告(使用 printk ), 当一个分配无法满足.
__GFP_HIGH
这个标志标识了一个高优先级请求, 它被允许来消耗甚至被内核保留给紧急状况的最后的内存页.
__GFP_REPEAT
__GFP_NOFAIL
__GFP_NORETRY
这些标志修改分配器如何动作, 当它有困难满足一个分配. __