序文
この章は長すぎます。Linuxカーネルのメモリ管理についての私の理解を簡単に説明するために、いくつかのブログ投稿を分割しました。このブログでは、主に物理メモリシステムの組織モデルについて説明しています。
概要概要
オペレーティングシステムの各プロセスに仮想メモリ空間(仮想アドレス空間)が割り当てられていることはすでにご存知かもしれません。この仮想メモリ空間はカーネルによって分割および操作されます。仮想アドレス空間と物理メモリはページテーブルを介してマッピングされます。Linux X86カーネルアーキテクチャには通常、3:1に従って分割された4G仮想アドレス空間があります。下部の3Gはプロセスユーザーモードに使用され、上部の1Gはカーネルモードに使用され、カーネルは1つしかないため、上部は各プロセスの仮想アドレス空間の内容同じです。
さまざまな物理メモリ管理方法に従って、コンピュータは次のように分類できます。
UMAコンピュータ:均一なメモリアクセス、均一なメモリアクセス。
NUMA計算:不均一なメモリアクセス、不均一なメモリアクセス
2つの違いは次のとおりです。
つまり、UMAシステムはCPUアクセスのためにすべてのメモリを継続的に編成し、NUMAシステムの各CPUには独自のローカルメモリがあり、ローカルメモリへのCPUアクセスの速度ブロックがあり、非ローカルメモリへのアクセスは低速です。
(N)UMAモデルのメモリ構成
概要概要
UMAモデルかNUMAモデルかに関係なく、コアは同じ論理処理を使用しますが、UMAモデルはノードが1つしかないNUMAと見なされる点が異なります。まず、カーネルは物理メモリをノードに分割します(たとえば、大規模なサーバーには複数のメモリバンク/ CPUがあり、各CPUは複数のローカルメモリバンクに関連付けられています)。これはpg_data_tで表されます。
次に、各ノードはゾーンゾーンに分割され、zone_typeを列挙することで区別されます。通常のドメイン、ハイエンドメモリドメイン、DMA(ダイレクトメモリアクセス、ダイレクトメモリストレージ)ドメインなど。
最後に、異なるメモリドメインは、ページフレームとも呼ばれる複数のページ(ページ)に分割されます。
DMAドメイン:訪問する特別な機器用。
NORMALドメイン:カーネルセグメント(仮想アドレス)に直接マッピングできる通常のメモリドメイン。
HIGMEMドメイン:カーネルセグメントを超えた物理メモリ領域。
enum zone_type {
#ifdef CONFIG_ZONE_DMA
/*
* ZONE_DMA is used when there are devices that are not able
* to do DMA to all of addressable memory (ZONE_NORMAL). Then we
* carve out the portion of memory that is needed for these devices.
* The range is arch specific.
*
* Some examples
*
* Architecture Limit
* ---------------------------
* parisc, ia64, sparc <4G
* s390 <2G
* arm Various
* alpha Unlimited or 0-16MB.
*
* i386, x86_64 and multiple other arches
* <16M.
*/
ZONE_DMA,
#endif
#ifdef CONFIG_ZONE_DMA32
/*
* x86_64 needs two ZONE_DMAs because it supports devices that are
* only able to do DMA to the lower 16M but also 32 bit devices that
* can only do DMA areas below 4G.
*/
ZONE_DMA32,
#endif
/*
* Normal addressable memory is in ZONE_NORMAL. DMA operations can be
* performed on pages in ZONE_NORMAL if the DMA devices support
* transfers to all addressable memory.
*/
ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM
/*
* A memory area that is only addressable by the kernel through
* mapping portions into its own address space. This is for example
* used by i386 to allow the kernel to address the memory beyond
* 900MB. The kernel will set up special mappings (page
* table entries on i386) for each page that the kernel needs to
* access.
*/
ZONE_HIGHMEM,
#endif
ZONE_MOVABLE,
#ifdef CONFIG_ZONE_DEVICE
ZONE_DEVICE,
#endif
__MAX_NR_ZONES
};
データ構造
- メモリノード
カーネルはpg_data_t構造を使用してすべてのメモリノードを管理し、独自のポインタメンバーpgdat_next(4.4.20のカーネルソースコードにはなく、他のメソッドに変更)が直列に接続されて、内のすべてのメモリノードのノードチェーンを形成します。システム。ノード構造には、フィールドの配列も含まれています。
typedef struct pglist_data {
struct zone node_zones[MAX_NR_ZONES];
…
}pg_data_t;
- メモリドメイン
カーネルはゾーン構造を使用してメモリドメインを表します。ドメイン構造には、ページスワップアウトの「透かし」、ホットページラベルとコールドページラベルなど、さまざまなページフレームの管理メンバーが含まれていると考えられます。
struct zone {
unsigned long watermark[NR_WMARK]; /* 水印数组 */
long lowmem_reserve[MAX_NR_ZONES]; /* 保留内存区域,用于内核关键步骤 */
struct per_cpu_pageset __percpu *pageset; /* 冷热页帧列表 */
- ページフレーム
ページフレームは、構造体ページで表される物理メモリ割り当ての最小単位です。各ページフレームはカーネル構造に対応しているため、構造自体のサイズが大きくなりすぎないようにする必要があります。カーネルはユニオン構造を使用してこれを巧みに実現します。非常に複雑なので、ここでは省略します。Linux(4K)でのページフレームサイズの表示:
zglinux zhaogang # getconf PAGE_SIZE
4096
上記の分析により、次の図を使用して、Linuxカーネルの物理メモリの表現を次のように要約できます。ノード----ドメイン----ページフレームの3レベルモデル。
カーネルのメモリの最適化とリサイクル技術では、ページフレームはさらに、移動不可能なページ、リサイクル可能なページ、取り外し可能なページなどに分割されます。使用される列挙は次のように定義されます。
enum {
MIGRATE_UNMOVABLE,
MIGRATE_MOVABLE,
MIGRATE_RECLAIMABLE,
MIGRATE_PCPTYPES, /* the number of types on the pcp lists */
MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,
MIGRATE_CMA,
#endif
#ifdef CONFIG_MEMORY_ISOLATION
MIGRATE_ISOLATE, /* can't allocate from here */
#endif
MIGRATE_TYPES
};
procファイルシステムのpagetypeinfoファイルを表示することにより、各ステージパートナーシステム(カーネル物理ページフレームの管理に使用)のページタイプ情報を表示できます。
概要
カーネルのMM(メモリ管理)モジュールは非常に複雑であると説明できます。N回読んだことがありますが、その場で少しだけ感じます。物理メモリ管理、仮想メモリ管理、物理アドレスが含まれます。仮想アドレスマッピング(ページテーブル)、初期メモリ管理など。この記事は、Linuxメモリモデルの構成についての予備的な紹介にすぎません。読者がそれを詳細に分析できることを願っています。