分配原理 |
可以分配的最大内存 |
其他 |
|
__get_free_pages |
直接对页框进行操作 |
4MB |
适用于分配较大量的连续物理内存 |
kmem_cache_alloc |
基于slab机制实现 |
128KB |
适合需要频繁申请释放相同大小内存块时使用 |
kmalloc |
基于kmem_cache_alloc实现 |
128KB |
最常见的分配方式,需要小于页框大小的内存时可以使用 |
vmalloc |
建立非连续物理内存到虚拟地址的映射 |
物理不连续,适合需要大内存,但是对地址连续性没有要求的场合 |
|
dma_alloc_coherent |
基于__alloc_pages实现 |
4MB |
适用于DMA操作 |
ioremap |
实现已知物理地址到虚拟地址的映射 |
适用于物理地址已知的场合,如设备驱动 |
|
alloc_bootmem |
在启动kernel时,预留一段内存,内核看不见 |
小于物理内存大小,内存管理要求较高 |
kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。
较常用的 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_ATOM
对应的是内存释放函数:
void kfree(const void *objp);
转载自:https://blog.csdn.net/wzhwho/article/details/4996510