内存平衡
gfp_mask是内存分配掩码,gfp是get free page的缩写
GFP分配掩码的布局
分配掩码包括两部分,内存域修饰符(占低4位)和内存分配标志(从第5位开始)
1.内存域修饰符
内存域zone有ZONE_DMA、ZONE_DMA32、ZONE_NORMAL、ZONE_HIGHMEM、ZONE_MOVABLE,内存域的修饰符有:
#define __GFP_DMA 0x01u
#define __GFP_HIGHMEM 0x02u
#define __GFP_DMA32 0x04u
#define __GFP_MOVABLE 0x08u
唯独没有ZONE_NORMAL的修饰符,因为ZONE_NORMAL是默认的内存申请类型。
对应的内存域修饰符与伙伴系统分配器扫描内存域的顺序的关系如下:
无 ZONE_NORMAL->ZONE_DMA32->ZONE_DMA
__GFP_DMA32 ZONE_DMA32->ZONE_DMA
__GFP_DMA ZONE_DMA
__GFP_DMA&__GFP_HIGHMEM ZONE_DMA
__GFP_HIGHMEM ZONE_HIGHMEM-> ZONE_NORMAL->ZONE_DMA32->ZONE_DMA
2.内存分配标志
#define __GFP_WAIT ((__force gfp_t)___GFP_WAIT) /* 内存分配的过程中可以被打断 */