【Linuxカーネルメモリ管理】パーティションパートナーアロケータ②(free_area空き領域構造ソースコード|割り当てフラグビット|GFP_ZONE_TABLEフラグビット領域タイプマッピングテーブル|割り当てフラグビットに対応するメモリ領域タイプ)





1.Free_area空き領域構造のソースコード分析



前のブログ[Linuxカーネルメモリ管理]パーティションパートナーアロケータ①(パーティションパートナーアロケータソースデータ構造|free_area空き領域配列|MAX_ORDERマクロ定義|空き領域のページの最大順序)

メモリ領域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_DMAZONE_DMAメモリ領域のタイプに対応するフラグ。
  • ___GFP_HIGHMEMZONE_HIGHMEMメモリ領域のタイプに対応するフラグ。
  • ___GFP_DMA32ZONE_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列挙ソースコード)ブログ;

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/han1202012/article/details/124329108