本文主要是介绍内核中与驱动相关的内存操作之五(kmalloc),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在内核空间里面获取一段内存区域,最常用到的API就是kmalloc.
1.原型(lk2.6.22)如下:
static inline void *kmalloc(size_t size, gfp_t flags)
2.参数说明:
size:
要分配内存空间的大小,以字节为单位.
flags:
分配标志,用来控制kmalloc的行为.主要如下:
2-1.
GFP_KERNEL:
这是最常用的标志.以此标志控制的kmalloc行为的内存分配,会引起睡眠.因此,不能在进程上下文之外使用此标志来获取内存,否则会有很大的风险和隐患.如原子上下文、中断上下文、tasket、内核定时器这些场景,不应该使用此标志来获取内存;
GFP_ATOMIC:
针对上述GFP_KERNEL所带来的局限,GFP_ATOMIC分配内存期间不会引起睡眠.
__GFP_DMA:
在ZONE_DMA区间获取内存.例如X86,DMA区用在RAM的前16M,传统的ISA设备可以分配此DMA区域内存;
__GFP_HIGHMEM:
在ZONE_HIGHMEM区间获取内存.kmalloc是不能用来分配高端内存区间的内存的.
最常用的就是前面两个标志,后面的也往往接触到,其他的就比较"冷门
这篇关于内核中与驱动相关的内存操作之五(kmalloc)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!