基于2.6.32内核源码分析
首选内存区和gfp描述符关系运算
64位系统默认没有开启CONFIG_HIGHMEM选项,因此只有4个内存区DMA(0),DMA32(1),NORMAL(2),MOVABLE(3),因此在gfp标志中关于内存区选择的标志有如下4个,并通过宏GFP_ZONEMASK从gfp标志中提取出这些个标志。 然后通过一个人工定义的映射表将上面的四个gfp标志映射为具体的内存区,进而确定分配内存时首选内存区。
1 #define __GFP_DMA ((__force gfp_t)0x01u) 2 #define __GFP_HIGHMEM ((__force gfp_t)0x02u) 3 #define __GFP_DMA32 ((__force gfp_t)0x04u) 4 #define __GFP_MOVABLE ((__force gfp_t)0x08u) /* Page is movable */ 5 #define GFP_ZONEMASK (__GFP_DMA|__GFP_HIGHMEM|__GFP_DMA32|__GFP_MOVABLE)