| |– 中断处理程序 GFP_ATOMIC | |– 软中断 GFP_ATOMIC | |– Tasklet GFP_ATOMIC |– 用于DMA的内存,可以睡眠 GFP_DMA | GFP_KERNEL |– 用于DMA的内存,不可以睡眠 GFP_DMA |GFP_ATOMIC 如果进程上下文允许睡眠情况下尽量用GFP_KERNEL, 如果进程上下文禁止休眠的话(如中断,taskletd等)必须用GFP_ATOMIC...
|– 用于DMA的内存,不可以睡眠 GFP_DMA |GFP_ATOMIC 对应的内存释放函数为: voidkfree(constvoid*objp); kzalloc /** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @flags: the type of memory to allocate (see kmalloc). */stati...
GFP_ATOMIC —— 分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断; GFP_KERNEL —— 正常分配内存; GFP_DMA ——给 DMA 控制器分配内存,需要使用该标志(DMA要求分配虚拟地址和物理地址连续)。 flags 的参考用法: |– 进程上下文,可以睡眠 GFP_KERNEL |– 进程上下文,不可以睡眠 ...
如果gfp_t flags 明确指定了 __GFP_DMA,则内核向 kmalloc 内存池申请的内存均来自于 ZONE_DMA 物理内存区域。 如果gfp_t flags 明确指定了 __GFP_RECLAIMABLE,则内核向 kmalloc 内存池申请的内存均是可以被回收的。 static __always_inline enum kmalloc_cache_type kmalloc_type(gfp_t flags) { #ifdef //...
kmalloc 分配内存的过程可以是原子过程(使用 GFP_ATOMIC),而 vmalloc 分配内存时则可能产生阻塞; kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快; 一般情况下,内存只有在要被 DMA 访问的时候才需要物理上连续,但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用 vmalloc()。
(size-1);}#ifdef CONFIG_ZONE_DMAif(unlikely((flags&GFP_DMA)))returnkmalloc_dma_caches[index];#endifreturnkmalloc_caches[index];}void*__kmalloc(size_tsize,gfp_tflags){structkmem_cache*s;void*ret;if(unlikely(size>KMALLOC_MAX_CACHE_SIZE))// 因为其他地方可能直接调用__kmalloc,所以这个判断...
kmalloc 分配内存的过程可以是原子过程(使用 GFP_ATOMIC),而 vmalloc 分配内存时则可能产生阻塞; kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快; 一般情况下,内存只有在要被 DMA 访问的时候才需要物理上连续,但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用 vmalloc()。
__GFP_DMA 该标志请求分配发生在可进行DMA的内存区段中。 __GFP_HIGHMEM 该标志表明要分配的内存可位于高端内存。 __GFP_NOWAPN 该标志使用的次数较少,它主要是避免内核在无法满足分配请求时产生警告信息。 __GFP_COLD 该标志表示请求尚未使用的“冷”页面。
*/ /* line 46 ~ line 192 第二部分 * 定义掩码和MASK信息, 第二部分的某些宏可能是第一部分一个或者几个的组合 * 定义形式为 #define __GFP_XXX ((__force gfp_t)___GFP_XXX) */ #define __GFP_DMA ((__force gfp_t)___GFP_DMA) #define __GFP_HIGHMEM ((__force gfp_t)___GFP_...
用于DMA的内存,不可以睡眠:GFP_DMA |GFP_ATOMIC 对应的内存释放函数为: AI检测代码解析 voidkfree(constvoid*objp); 1. kzalloc kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的,可以说是前者是后者的一个变种,因为 kzalloc() 实际上只是额外附加了 __GFP_ZERO 标...