内存管理buddy[原理]

关于内存去的选择:

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)
 1 #define GFP_ZONE_TABLE ( \
 2     (ZONE_NORMAL << 0 * ZONES_SHIFT)                \
 3     | (OPT_ZONE_DMA << __GFP_DMA * ZONES_SHIFT)             \
 4     | (OPT_ZONE_HIGHMEM << __GFP_HIGHMEM * ZONES_SHIFT)        \
 5     | (OPT_ZONE_DMA32 << __GFP_DMA32 * ZONES_SHIFT)            \
 6     | (ZONE_NORMAL << __GFP_MOVABLE * ZONES_SHIFT)            \
 7     | (OPT_ZONE_DMA << (__GFP_MOVABLE | __GFP_DMA) * ZONES_SHIFT)    \
 8     | (ZONE_MOVABLE << (__GFP_MOVABLE | __GFP_HIGHMEM) * ZONES_SHIFT)\
 9     | (OPT_ZONE_DMA32 << (__GFP_MOVABLE | __GFP_DMA32) * ZONES_SHIFT)\
10 )
 1 static inline enum zone_type gfp_zone(gfp_t flags)
 2 {
 3     enum zone_type z;
 4     int bit = flags & GFP_ZONEMASK;
 5 
 6     z = (GFP_ZONE_TABLE >> (bit * ZONES_SHIFT)) &
 7                      ((1 << ZONES_SHIFT) - 1);
 8 
 9     if (__builtin_constant_p(bit))
10         MAYBE_BUILD_BUG_ON((GFP_ZONE_BAD >> bit) & 1);
11     else {
12 #ifdef CONFIG_DEBUG_VM
13         BUG_ON((GFP_ZONE_BAD >> bit) & 1);
14 #endif
15     }
16     return z;
17 }
1 #if MAX_NR_ZONES < 2
2 #define ZONES_SHIFT 0
3 #elif MAX_NR_ZONES <= 2
4 #define ZONES_SHIFT 1
5 #elif MAX_NR_ZONES <= 4
6 #define ZONES_SHIFT 2
7 #else
8 #error ZONES_SHIFT -- too many zones configured adjust calculation
9 #endif
 1 #ifdef CONFIG_HIGHMEM
 2 #define OPT_ZONE_HIGHMEM ZONE_HIGHMEM
 3 #else
 4 #define OPT_ZONE_HIGHMEM ZONE_NORMAL
 5 #endif
 6 
 7 #ifdef CONFIG_ZONE_DMA
 8 #define OPT_ZONE_DMA ZONE_DMA
 9 #else
10 #define OPT_ZONE_DMA ZONE_NORMAL
11 #endif
12 
13 #ifdef CONFIG_ZONE_DMA32
14 #define OPT_ZONE_DMA32 ZONE_DMA32
15 #else
16 #define OPT_ZONE_DMA32 ZONE_NORMAL
17 #endif
 1 enum zone_type {
 2 #ifdef CONFIG_ZONE_DMA
 3     ZONE_DMA,
 4 #endif
 5 #ifdef CONFIG_ZONE_DMA32
 6     ZONE_DMA32,
 7 #endif
 8     ZONE_NORMAL,
 9 #ifdef CONFIG_HIGHMEM
10     ZONE_HIGHMEM,
11 #endif
12     ZONE_MOVABLE,
13     __MAX_NR_ZONES
14 };

猜你喜欢

转载自www.cnblogs.com/DoOrDie/p/9853478.html
今日推荐