記事ディレクトリ
1.Free_area空き領域構造のソースコード分析
メモリ領域zone
構造メンバーは、空きfree_area
ページブロックを維持するために使用される配列データ構造であり、配列の添え字インデックスはページブロックの順序に対応します。free_area
free_area
構造は、Linuxカーネルのソースコードlinux-4.12 \ include \ linux \ mmzone.h #95の場所で定義されています。
MIGRATE_TYPES
値が44の列挙型です。4 ;
struct free_area {
struct list_head free_list[MIGRATE_TYPES];
unsigned long nr_free;
};
ソースコードパス: linux-4.12 \ include \ linux \ mmzone.h #95
2.フラグビットを割り当てます
物理ページを申請する場合、メモリ領域のタイプは最下位の44に基づきます。4つのフラグビットが決定されます。
一般的に使用される444つのフラグビットは次のとおりです。これらのフラグビットは、Linuxカーネルのソースコードlinux-4.12 \ include \ linux \ gfp.h#18の場所で定義されています。
/* Plain integer GFP bitmasks. Do not use this directly. */
#define ___GFP_DMA 0x01u
#define ___GFP_HIGHMEM 0x02u
#define ___GFP_DMA32 0x04u
#define ___GFP_MOVABLE 0x08u
ソースパス: linux-4.12 \ include \ linux \ gfp.h #18
3.GFP_ZONE_TABLEフラグゾーンタイプマッピングテーブル
Linuxカーネルでは、GFP_ZONE_TABLE
マクロ定義します。
GFP_ZONES_SHIFT
エリアタイプに対応するビット数です。
GFP_ZONE_TABLE
、各フラグビットの組み合わせは3232にマップされます3 2ビット整数指定位置、
ここで、offsetはフラグ*エリアタイプビットの組み合わせです。
#define GFP_ZONE_TABLE ( \
(ZONE_NORMAL << 0 * GFP_ZONES_SHIFT) \
| (OPT_ZONE_DMA << ___GFP_DMA * GFP_ZONES_SHIFT) \
| (OPT_ZONE_HIGHMEM << ___GFP_HIGHMEM * GFP_ZONES_SHIFT) \
| (OPT_ZONE_DMA32 << ___GFP_DMA32 * GFP_ZONES_SHIFT) \
| (ZONE_NORMAL << ___GFP_MOVABLE * GFP_ZONES_SHIFT) \
| (OPT_ZONE_DMA << (___GFP_MOVABLE | ___GFP_DMA) * GFP_ZONES_SHIFT) \
| (ZONE_MOVABLE << (___GFP_MOVABLE | ___GFP_HIGHMEM) * GFP_ZONES_SHIFT)\
| (OPT_ZONE_DMA32 << (___GFP_MOVABLE | ___GFP_DMA32) * GFP_ZONES_SHIFT)\
)
4.割り当てフラグに対応するメモリ領域のタイプ。
ソースコードパス: linux-4.12 \ include \ linux \ gfp.h #296
上記のフラグに対応するエリアタイプは次のとおりです。
___GFP_DMA
ZONE_DMA
メモリ領域のタイプに対応するフラグ。___GFP_HIGHMEM
ZONE_HIGHMEM
メモリ領域のタイプに対応するフラグ。___GFP_DMA32
ZONE_DMA32
メモリ領域のタイプに対応するフラグ。
#ifdef CONFIG_HIGHMEM
#define OPT_ZONE_HIGHMEM ZONE_HIGHMEM
#else
#define OPT_ZONE_HIGHMEM ZONE_NORMAL
#endif
#ifdef CONFIG_ZONE_DMA
#define OPT_ZONE_DMA ZONE_DMA
#else
#define OPT_ZONE_DMA ZONE_NORMAL
#endif
#ifdef CONFIG_ZONE_DMA32
#define OPT_ZONE_DMA32 ZONE_DMA32
#else
#define OPT_ZONE_DMA32 ZONE_NORMAL
#endif
ソースコードパス: linux-4.12 \ include \ linux \ gfp.h #296
メモリ領域タイプリファレンス[Linuxカーネルメモリ管理]物理メモリ構成⑤(メモリ領域ゾーンタイプの概要|メモリ領域タイプzone_type列挙ソースコード分析| zone_type列挙ソースコード)ブログ;