Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linux仮想メモリ管理に関する個人的なメモ

Linux仮想メモリ管理に関する個人的なメモ

  

数日前、私は単に「Linuxカーネルメモリ管理について」と説明しましたが、このテキストは非常に短く、読むのは簡単ではありません。私はまた最初にいくつかのメモを取ることを忘れないでください、内容はより個人的です、理解するものは何もありません、許してください:p

『Memory Management』は実際には非常に広い言葉です、物理ページ管理、ページテーブル管理、アドレス空間管理各部分からのメモリ割り当てなどは、それぞれ「メモリ管理」と呼ぶことができますが、それらの違いは大きく、過去をカバーするという言葉では、森を見ていない、盲目のようなものです。その全体像を理解するためには、個別に議論することをお勧めします。すべての部分を把握できれば、全体像は見えません。

システム初期化とメモリレイアウト

ブートフェーズ(setup.o)では、カーネルはまず2つの一時ページテーブルをページディレクトリswapper_pg_dir ^ 1の最初の2つのエントリにマッピングします。これは0〜8mになります。 3g〜3g + 8mの仮想アドレスは同時に0〜8mの物理アドレスにマッピングされます。

カーネルページテーブルの初期化は、カーネル初期化フェーズのkernel_physical_mapping_init()関数にあります。可能であれば、PSEを使用して大きいページを設定し、PGEを使用してグローバルページを設定し、TLB内のメモリマップを修正し、アドレススペースを切り替えるときに再度リフレッシュする必要はありません。

Linuxの固定マッピングカーネルアドレス空間。 x86マシンでは、物理メモリは3つのゾーンに分割されます。◦ZONE_DMA:0〜16m◦ZONE_NORMAL:16m〜896m◦ZONE_HIGHMEM:896m〜

ここで、ZONE_DMAとZONE_NORMALは固定的に0xc000000にマッピングされます。 128MBのアドレス空間は、ZONE_HIGHMEMまたはFIXMAP内の物理ページをマップするために使用されます。

x64では、アドレス空間はすべての物理メモリをマップするのに十分です。ZONE_HIGHMEMは空です。

kmap

カーネル内でZONE_HIGHMEMのメモリを使用するには、まずkmap()を使用してそれをカーネルアドレス空間にマップする必要があります。

しかしkmap()はスリープ状態になるかもしれず、割り込みコンテキストでkmap_atomic()を使用しなければなりません。

Buddy Allocatorと物理ページ管理

Linuxでは、Buddy Allocatorは2乗の連続した物理ページのページレベルのメモリアロケータとして使用されます。これは、カーネルメモリアロケータとページキャッシュのバックエンドの両方として機能します。

関連するルーチンはalloc_pages(gfp_t、gfp_mask、unsigned int order)で、ページ構造のリンクリストを返します。

限られたリソースでバッファをバウンスする方法:DMAメモリが限られており、ライフサイクルのためのスペースがあります;◦kmap_atomic():予約済みページテーブルの項目はできるだけ早く、できるだけ早く解放します。

NUMAとNode

SMPシステムでは、CPUが増加すると、無差別のメモリアクセスがスケーラビリティに影響するボトルネックになります^ 2。これを解決するには、プロセッサごとに別々のメモリを用意し、原則としてプロセッサはできるだけ近くにあるメモリにのみアクセスすることで、メモリアクセスのスケーラビリティを向上させます。これはNUMA(Non-Uniform Memory Access)で、各プロセッサとメモリをまとめてノードと呼びます。

そしてカーネルがする必要があるのは、CPUがメモリを割り当てるときにこのノードのメモリだけを割り当てることです。 Linuxでは、Nodeの構造はpg_data_tです。

スラブとカーネルのメモリ割り当て

カーネルでメモリを使うには、Slabを使います。これはバディアロケータをバックエンドとして使用し、大きなメモリブロック用のアプリケーションは小さなブロックに分割され、それぞれが大きなメモリブロックです。 ◦kmem_cache_alloc()およびkmem_cache_free()、カーネルで一般的に使用される構造体を割り当てるための専用メモリアロケータ。 ◦kmalloc()およびkfree()、汎用メモリアロケータ。その背後にはサイズの異なるスラブのセットがあります。

構造体の割り当て/解放がそれほど頻繁ではない場合は、通常kmalloc()を使用するだけで十分です。

ページテーブル管理

x86 linuxの3レベルページテーブルは、実際にはPAE用に用意されています64ビットマシンを使用している場合は、4つのレベルが必要です。

misc notes◦struct address_space実際には、カーネル内のユーザアドレス空間を記述する構造体はstruct mm_structです。 struct address_space構造は、ページキャッシュの説明に似ています。 ◦GFPは、Get Free Pageの略です。

Copyright © Windowsの知識 All Rights Reserved