kmalloc
与 __get_free_pages
kmalloc
kmalloc
可以申请的内存上限由头文件 linxu/kmalloc_sizes.h
来定义
一般情况下上限为 128k
,如果打开宏 KMALLOC_MAX_SIZE
可以申请更大的内存
kmalloc
申请的内存位于物理内存映射范围,而且在物理上是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在简单的转换关系,对申请的内存大小有限制
常用的 flags
:
- GFP_ATOMIC 分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断
- GFP_KERNEL 正常分配内存
- GFP_DMA 给 DMA 控制器分配内存,需要使用该标志(DMA 要求分配虚拟地址和物理地址连续)
flags
参考用法:
|– 进程上下文,可以睡眠 GFP_KERNEL
|– 进程上下文,不可以睡眠 GFP_ATOMIC
| |– 中断处理程序 GFP_ATOMIC
| |– 软中断 GFP_ATOMIC
| |– Tasklet GFP_ATOMIC
|– 用于 DMA 的内存,可以睡眠 GFP_DMA | GFP_KERNEL
|– 用于 DMA 的内存,不可以睡眠 GFP_DMA |GFP_ATOMIC
__get_free_pages
__get_free_pages