LINUX KERNEL “kmalloc”
1. 函数原型
void *
kmalloc
(size_t size, int flags);
存在于<linux/slab.h>中。
2. 函数简要说明
Kmalloc提供了再设备驱动程序或者内核中动态分配内存的方式,kmalloc函数返回的是虚拟地址(线性地址),分配的内存在物理上是连续的,这对于要进行DMA的设备十分 真实的物理地址只有一个固定的偏移,因此存在比较简单的转换关系。Kmalloc最多只能分配32*PAGE_SIZE大小的内存,一般PAGE_SIZE=4KB,也就是128KB大小的内存,这128KB的内存还要有16个字节用来页面描述结构。
3. 参数说明
2.1参数含义
size: 需要分配的内存字节数
flags: 分配内存的类型
2.2参数描述
size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。
size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。size_t的设计就是为了适应多个平台的,增加程序在不同平台上的可移植性。
kmalloc的flags参数决定了要分配的内存的类型,kmalloc提供了多种内存分配行为,使用flags标志,可以控制kmalloc的行为。
所有的flags都定义在 <linux/gfp.h>中。
下表给出针对不同的flags的不同含义:
flags |
含义(说明,使用情况) |
GFP_KERNEL |
1. 最常用的flag,代表一个在内核空间运行的线程进行调用,只能在进程内核空间调用,就是说函数是代表一个进程在执行一个系统调用,如果内存不足则当前进行会进行睡眠。 2. 只能在用户进程上下文中使用,是最可靠的内存分配方式。 3. 并不是总是正确的内存分配方式,如果在进程上下文之外调用kmalloc则会出错。 4. 允许在分配内存时如果内存不足进行睡眠进行等待,因此这时分配函数必须是可以重入的。 5. 如果在处理进程上线文之外的请求,例如中断处理、tasklet以及内核时钟等,则不允许睡眠等待内存,应使用GFP_ATOMIC。 |
GFP_ATOMIC |
1. 用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠. 2. 能够实现分配即使是最后一个空闲页,如果最后的页都不是空闲页,则分配失败。 3. 没有GFP_KERNEL分配内存可靠,应该有良好的内存溢出处理策略。 |
GFP_USER |
1. 用来为用户空间页来分配内存。 2. 可能睡眠。 |
GFP_HIGHUSER |
1. 和GFP_USER,如果存在高端内存则进行分配高端内存。 |
GFP_NOIO |