検索
ホームページシステムチュートリアルLinuxLinux メモリ モデル: メモリ管理のより深い理解

Linux メモリ モデル: メモリ管理のより深い理解

Feb 13, 2024 pm 03:15 PM
linuxLinuxチュートリアルLinuxシステムLinux オペレーティング システムLinuxコマンドシェルスクリプトLinuxシステム構成配置overflow埋め込みLinuxLinux を始めるLinux学習

Linux システムでさまざまなメモリの問題に遭遇したことがありますか?メモリリーク、メモリの断片化など。これらの問題は、Linux メモリ モデルを深く理解することで解決できます。

######I.はじめに######

Linux カーネルは、フラット メモリ モデル、不連続メモリ モデル、スパース メモリ モデルという 3 つのメモリ モデルをサポートします。いわゆるメモリ モデルは、実際には、CPU の観点から見た物理メモリの分布と、Linux カーネルでこれらの物理メモリを管理するために使用される方法を指します。さらに、この記事は主に共有メモリ システムに焦点を当てていることに注意してください。これは、すべての CPU が物理アドレス空間を共有することを意味します。 この記事の内容は次のように構成されています: メモリ モデルを明確に分析するために、第 2 章でいくつかの基本用語について説明します。 3 番目の章では、3 つのメモリ モデルの動作原理について説明します。最後の章はコード分析です。コードは 4.4.6 カーネルからのものです。アーキテクチャ関連のコードについては、分析に ARM64 を使用します。

2. メモリモデルに関する用語

1. ページフレームとは何ですか? オペレーティング システムの最も重要な機能の 1 つは、コンピュータ システム内のさまざまなリソースを管理することであり、最も重要なリソースであるメモリを管理する必要があります。 Linux オペレーティング システムでは、物理メモリはページ サイズに従って管理されます。特定のページ サイズは、ハードウェアおよび Linux システム構成に関連します。4K が最も古典的な設定です。そこで、物理メモリをページサイズごとにページに分割し、各物理メモリ内のページサイズのメモリ領域をページフレームと呼びます。各物理ページ フレームの構造体ページ データ構造を確立して、各物理ページの使用状況を追跡します。カーネルのテキスト セグメントに使用されているか?それともプロセスのページテーブルでしょうか?さまざまなファイル キャッシュに使用されていますか、それとも無料の状態ですか...

各ページ フレームには、1 対 1 に対応するページ データ構造があります。システムは、ページ フレーム番号とページ データ構造の間で変換するために、page_to_pfn および pfn_to_page マクロを定義します。具体的な変換方法は、メモリ モジュールに関連します。説明します。 Linux カーネルの 3 つのメモリ モデルについては、第 3 章で詳しく説明します。

2.PFNとは何ですか?

コンピュータ システムの場合、その物理アドレス空間全体は、0 から始まり、実際のシステムがサポートできる最大物理空間で終わるアドレス空間である必要があります。 ARM システムでは、物理アドレスが 32 ビットであると仮定すると、物理アドレス空間は 4G となり、ARM64 システムでは、サポートされる物理アドレス ビット数が 48 である場合、物理アドレス空間は 256T になります。もちろん、実際には、このような大きな物理アドレス空間のすべてがメモリに使用されるわけではなく、一部は I/O 空間にも属します (もちろん、一部の CPU アーチには独自の独立した IO アドレス空間があります)。したがって、メモリが占​​有する物理アドレス空間は限られた範囲になるはずであり、物理アドレス空間全体をカバーすることは不可能である。しかし、メモリがますます大容量化している現在、32 ビット システムの場合、4G 物理アドレス空間ではメモリ要件を満たすことができなくなっているため、後で詳しく説明するハイ メモリという概念があります。

PFN はページ フレーム番号の略で、ページ フレームと呼ばれる物理メモリを指します。物理メモリはページ サイズの領域に分割され、各ページに番号が付けられます。この番号が PFN です。物理メモリがアドレス 0 から始まると仮定すると、PFN が 0 に等しいページ フレームは、アドレス 0 (物理アドレス) から始まるページになります。物理メモリがアドレス x から始まると仮定すると、最初のページ フレーム番号は (x>>PAGE_SHIFT) になります。

3. NUMA とは何ですか?

マルチプロセッサ システムのメモリ アーキテクチャを設計する場合、2 つのオプションがあります: 1 つは UMA (Uniform Memory Access) です。システム内のすべてのプロセッサは、どのプロセッサが開始したかに関係なく、統一された一貫した物理メモリ空間を共有します。アクセス時間はメモリアドレスまでは同じです。 NUMA (Non-Uniform Memory Access) は UMA とは異なり、特定のメモリ アドレスへのアクセスはメモリとプロセッサ間の相対位置に関係します。たとえば、ノード上のプロセッサの場合、ローカル メモリへのアクセスは、リモート メモリへのアクセスよりも時間がかかります。

3. Linux カーネルの 3 つのメモリ モデル

1. FLAT メモリ モデルとは何ですか?

システム内のプロセッサの観点から、プロセッサが物理メモリにアクセスするとき、物理アドレス空間がホールのない連続したアドレス空間である場合、このコンピュータ システムのメモリ モデルはフラット メモリです。このメモリ モデルでは、物理メモリの管理は比較的単純です。各物理ページ フレームには、それを抽象化するためのページ データ構造があります。したがって、システムには構造体ページ (mem_map) の配列があり、各配列エントリは実際の物理ページ フレーム (ページ フレーム)。フラット メモリの場合、PFN (ページ フレーム番号) と mem_map 配列インデックスの関係は線形です (固定オフセットがあり、メモリに対応する物理アドレスが 0 に等しい場合、PFN は配列インデックスになります)。したがって、PFN から対応するページ データ構造への移動、またはその逆が非常に簡単です (詳細については、page_to_pfn および pfn_to_page の定義を参照してください)。さらに、フラット メモリ モデルの場合、(不連続メモリ モデルと同じメカニズムを使用するため) ノード (struct pglist_data) が 1 つだけあります。次の図は、フラット メモリの状況を示しています:

Linux メモリ モデル: メモリ管理のより深い理解

構造体ページによって占有されるメモリは直接マップされた間隔内にあるため、オペレーティング システムがそのためのページ テーブルを作成する必要がないことを強調しておく必要があります。

2. 不連続メモリモデルとは何ですか?

CPU のアドレス空間にいくつかの穴があり、物理メモリにアクセスするときに不連続である場合、このコンピュータ システムのメモリ モデルは不連続メモリです。一般に、NUMA ベースのコンピュータ システムのメモリ モデルは不連続メモリですが、実際には 2 つの概念は異なります。 NUMAはメモリとプロセッサの位置関係を重視しており、メモリモデルとは関係ありませんが、同一ノード上のメモリとプロセッサはより密接な結合関係(高速アクセス)となるため、それを管理するには複数のノードが必要になります。不連続メモリは本質的にフラット メモリ メモリ モデルの拡張です。物理メモリ全体のアドレス空間のほとんどは、中央にいくつかの穴がある大きなメモリ部分です。メモリ アドレス空間の各部分はノードに属します (ノードの場合)。内部的には、ノードのメモリ モデルはフラット メモリです)。次の図は、不連続メモリの状況を示しています:

Linux メモリ モデル: メモリ管理のより深い理解

したがって、このメモリ モデルでは複数のノード データ (struct pglist_data) が存在し、マクロ定義 NODE_DATA は指定されたノードの struct pglist_data を取得できます。ただし、各ノードによって管理される物理メモリは、struct pglist_data データ構造の node_mem_map メンバーに格納されます (概念はフラット メモリの mem_map に似ています)。現時点では、PFN から特定の構造体ページへの変換は少し複雑になります。最初に PFN からノード ID を取得し、次にこの ID に基づいて対応する pglist_data データ構造を見つけ、次に対応するページ配列を見つける必要があります。以降の方法は同様のフラットメモリです。

3. スパース メモリ モデルとは何ですか?

メモリ モデルも進化の過程です。当初はフラット メモリが連続的なメモリ アドレス空間 (mem_maps[]) を抽象化するために使用されていました。NUMA の登場後、不連続なメモリ空間全体がいくつかのノードに分割され、それぞれがノードになります。ノード上の連続したメモリ アドレス空間、つまり、元の単一の mem_maps[] が複数の mem_maps[] になりました。すべてが完璧に見えますが、メモリ ホットプラグの出現により、ノード内の mem_maps[] でさえ不連続になる可能性があるため、元の完璧な設計は不完全になります。実際、スパース メモリの出現後、不連続メモリのメモリ モデルはそれほど重要ではなくなりました。スパース メモリが最終的に不連続メモリに取って代わることは当然です。この置換プロセスは現在進行中です。4.4 カーネルにはまだ 3 つのメモリ モデルがあります。から選ぶ。

疎メモリが最終的に不連続メモリに取って代わる可能性があると言われているのはなぜですか?実際、スパースメモリのメモリモデルでは、連続したアドレス空間をセクション(1Gなど)ごとに分割し、各セクションごとにホットプラグするため、スパースメモリではメモリアドレス空間をさらに細かく分割することができます。セクション。 、より多くの離散的不連続メモリをサポートします。さらに、スパース メモリが登場する前は、NUMA と不連続メモリは常に混乱する関係にありました。NUMA はメモリの連続性を規定しておらず、不連続メモリ システムは必ずしも NUMA システムではありませんでしたが、これら 2 つの構成はすべてマルチです。ノード。スパース メモリを使用すると、メモリの連続性の概念を NUMA から最終的に切り離すことができます。つまり、NUMA システムはフラット メモリまたはスパース メモリにすることができ、スパース メモリ システムは NUMA または UMA にすることができます。

次の図は、スパース メモリがページ フレームを管理する方法を示しています (SPARSEMEM_EXTREME が構成されています)。

Linux メモリ モデル: メモリ管理のより深い理解(注: 上の図の mem_section ポインターはページを指す必要があり、ページにはいくつかの struct mem_section データ ユニットがあります)

連続した物理アドレス空間全体がセクションごとに切り取られ、各セクション内ではメモリが連続している(フラットメモリの性質に準拠している)ため、セクションにmem_mapのページ配列が付加されます。ノード構造体 (struct pglist_data) の代わりに構造体 (struct mem_section) を使用します。もちろん、どのメモリモデルを使用する場合でも、PFNとページの対応付けは処理する必要がありますが、スパースメモリではセクションという概念が追加され、PFNSectionpageに変換されます。

まず、PFN からページ構造に変換する方法を見てみましょう: mem_section ポインター配列はカーネルで静的に定義されています。セクションには複数のページが含まれることがよくあるため、右シフトによって PFN をセクション番号に変換する必要があります。セクション番号は、PFN に対応するセクション データ構造を見つけるために、mem_section ポインター配列内のインデックスとして使用されます。セクションを見つけたら、section_mem_map に沿って対応するページ データ構造を見つけることができます。ちなみに、当初スパースメモリはポインタ配列ではなく一次元のmemory_section配列を使用していましたが、特にスパース(CONFIG_SPARSEMEM_EXTREME)なシステムではこの実装はメモリを非常に無駄に消費します。また、ホットプラグ対応のためにポインタを保存しておくと便利ですポインタが NULL の場合、セクションが存在しないことを意味します。上の図は、1 次元の mem_section ポインター配列 (SPARSEMEM_EXTREME が構成されている) の状況を示しています。SPARSEMEM_EXTREME 以外の構成でも、概念は同様です。特定の操作のコードを読み取ることができます。

ページから PFN に移動するのは少し面倒ですが、実は PFN は 2 つの部分に分かれており、1 つはセクションのインデックス、もう 1 つはセクション内のページのオフセットです。まずページからセクション インデックスを取得し、次に対応するメモリ セクションを取得する必要があります。メモリ セクションがわかっているということは、ページがセクションメム マップ内にあることを意味し、セクション内のページのオフセットもわかっています。最後に、PFN を合成できます。 。ページをセクション インデックスに変換するには、スパース メモリには 2 つの解決策があります。最初に、page->flags に保存される (SECTION_IN_PAGE_FLAGS が設定されている) 従来の解決策を見てみましょう。この方法の最大の問題は、このフラグには情報が多すぎるため、ページ->フラグのビット数が必ずしも十分ではないことです。さまざまなページ フラグ、ノード ID、ゾーン ID にセクション ID が追加されるようになりました。達成できないアルゴリズム異なるアーキテクチャでの一貫性 普遍的なアルゴリズムはありますか?これは CONFIG_SPARSEMEM_VMEMMAP です。特定のアルゴリズムについては、次の図を参照してください:

Linux メモリ モデル: メモリ管理のより深い理解

(上の図には問題があります。PHYS_OFFSET が 0 に等しい場合、vmemmap は最初の構造体ページ配列のみを指します。一般的に言えば、オフセットがあるはずですが、私はそれを変更するのが面倒です。笑)

古典的なスパース メモリ モデルの場合、セクションの構造体ページ配列によって占有されるメモリは、直接マップされた領域から取得されます。ページ テーブルは初期化中に確立され、ページ フレームが割り当てられます。つまり、仮想アドレスが割り当てられます。ただし、SPARSEMEM_VMEMMAPの場合は最初から仮想アドレスが割り当てられており、vmemmapから始まる連続した仮想アドレス空間であり、各ページには対応する構造体ページがあり、当然仮想アドレスのみで物理アドレスは存在しません。したがって、セクションが発見されると、対応する構造体ページの仮想アドレスがすぐにわかります。もちろん、物理ページフレームを割り当ててからページテーブルを構築する必要もあります。したがって、この種のスパースメモリの場合、オーバーヘッドはわずかに大きくなります (マッピングを確立するもう 1 つのプロセス)。

4. コード分析

コード分析は主に include/asm-generic/memory_model.h を通じて実行されます。

1. フラットメモリ。コードは以下のように表示されます:

#「」 リーリー

# コードからわかるように、PFN と構造体ページ配列 (mem_map) インデックスは線形関係にあり、ARCH_PFN_OFFSET と呼ばれる固定オフセットがあり、このオフセットは推定されたアーキテクチャに関連しています。 ARM64 の場合は、arch/arm/include/asm/memory.h ファイルで定義されますが、当然、この定義はメモリが占​​有する物理アドレス空間に関係します (つまり、PHYS_OFFSET の定義に関係します)。

2. 不連続メモリモデル。コードは以下のように表示されます:

\#define __pfn_to_page(pfn)      \ 
({  unsigned long __pfn = (pfn);    \ 
unsigned long __nid = arch_pfn_to_nid(__pfn); \ 
NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\ 
})

\#define __page_to_pfn(pg)            \ 
({  const struct page *__pg = (pg);          \ 
struct pglist_data *__pgdat = NODE_DATA(page_to_nid(__pg));  \ 
(unsigned long)(__pg - __pgdat->node_mem_map) +      \ 
__pgdat->node_start_pfn;          \ 
})

Discontiguous Memory Model需要获取node id,只要找到node id,一切都好办了,比对flat memory model进行就OK了。因此对于__pfn_to_page的定义,可以首先通过arch_pfn_to_nid将PFN转换成node id,通过NODE_DATA宏定义可以找到该node对应的pglist_data数据结构,该数据结构的node_start_pfn记录了该node的第一个page frame number,因此,也就可以得到其对应struct page在node_mem_map的偏移。__page_to_pfn类似,大家可以自己分析。

3、Sparse Memory Model。经典算法的代码我们就不看了,一起看看配置了SPARSEMEM_VMEMMAP的代码,如下:

\#define __pfn_to_page(pfn)  (vmemmap + (pfn)) 
\#define __page_to_pfn(page)  (unsigned long)((page) - vmemmap)

简单而清晰,PFN就是vmemmap这个struct page数组的index啊。对于ARM64而言,vmemmap定义如下:

\#define vmemmap      ((struct page *)VMEMMAP_START - \ 
      SECTION_ALIGN_DOWN(memstart_addr >> PAGE_SHIFT))

毫无疑问,我们需要在虚拟地址空间中分配一段地址来安放struct page数组(该数组包含了所有物理内存跨度空间page),也就是VMEMMAP_START的定义。

总之,Linux内存模型是一个非常重要的概念,可以帮助你更好地理解Linux系统中的内存管理。如果你想了解更多关于这个概念的信息,可以查看本文提供的参考资料。

以上がLinux メモリ モデル: メモリ管理のより深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は良许Linux教程网で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Linuxシステム管理者の主なタスクは何ですか?Linuxシステム管理者の主なタスクは何ですか?Apr 19, 2025 am 12:23 AM

Linuxシステム管理者の主なタスクには、システムの監視とパフォーマンスチューニング、ユーザー管理、ソフトウェアパッケージ管理、セキュリティ管理とバックアップ、トラブルシューティングと解像度、パフォーマンスの最適化、ベストプラクティスが含まれます。 1. TOP、HTOP、その他のツールを使用して、システムのパフォーマンスを監視し、チューニングします。 2。ユーザーADDコマンドおよびその他のコマンドを介して、ユーザーアカウントとアクセス許可を管理します。 3. APTとYUMを使用してソフトウェアパッケージを管理し、システムの更新とセキュリティを確保します。 4.ファイアウォールを構成し、ログを監視し、データバックアップを実行して、システムセキュリティを確保します。 5.ログ分析とツールの使用を通じてトラブルシューティングと解決。 6.カーネルパラメーターとアプリケーションの構成を最適化し、ベストプラクティスに従ってシステムのパフォーマンスと安定性を向上させます。

Linuxを学ぶのは難しいですか?Linuxを学ぶのは難しいですか?Apr 18, 2025 am 12:23 AM

Linuxの学習は難しくありません。 1.Linuxは、UNIXに基づいたオープンソースオペレーティングシステムであり、サーバー、組み込みシステム、およびパーソナルコンピューターで広く使用されています。 2。ファイルシステムと許可管理を理解することが重要です。ファイルシステムは階層的であり、許可には読み取り、書き込み、実行が含まれます。 3。APTやDNFなどのパッケージ管理システムは、ソフトウェア管理を便利にします。 4。プロセス管理は、PSおよびTOPコマンドを通じて実装されます。 5. MKDIR、CD、Touch、Nanoなどの基本的なコマンドから学習を開始し、シェルスクリプトやテキスト処理などの高度な使用法を試してください。 6.許可問題などの一般的なエラーは、SudoとChmodを通じて解決できます。 7.パフォーマンスの最適化の提案には、HTOPを使用してリソースを監視すること、不要なファイルのクリーニング、SYの使用が含まれます

Linux管理者の給与はいくらですか?Linux管理者の給与はいくらですか?Apr 17, 2025 am 12:24 AM

Linux管理者の平均年salは、米国で75,000〜95,000ドル、ヨーロッパでは40,000〜60,000ユーロです。給与を増やすには、次のことができます。1。クラウドコンピューティングやコンテナテクノロジーなどの新しいテクノロジーを継続的に学習します。 2。プロジェクトの経験を蓄積し、ポートフォリオを確立します。 3.プロフェッショナルネットワークを確立し、ネットワークを拡大します。

Linuxの主な目的は何ですか?Linuxの主な目的は何ですか?Apr 16, 2025 am 12:19 AM

Linuxの主な用途には、1。Serverオペレーティングシステム、2。EmbeddedSystem、3。Desktopオペレーティングシステム、4。開発およびテスト環境。 Linuxはこれらの分野で優れており、安定性、セキュリティ、効率的な開発ツールを提供します。

インターネットはLinuxで実行されますか?インターネットはLinuxで実行されますか?Apr 14, 2025 am 12:03 AM

インターネットは単一のオペレーティングシステムに依存していませんが、Linuxはその上で重要な役割を果たしています。 Linuxは、サーバーやネットワークデバイスで広く使用されており、安定性、セキュリティ、スケーラビリティに人気があります。

Linux操作とは何ですか?Linux操作とは何ですか?Apr 13, 2025 am 12:20 AM

Linuxオペレーティングシステムのコアは、コマンドラインインターフェイスで、コマンドラインを介してさまざまな操作を実行できます。 1.ファイルおよびディレクトリ操作は、ファイルとディレクトリを管理するために、LS、CD、MKDIR、RM、その他のコマンドを使用します。 2。ユーザーおよび許可管理は、useradd、passwd、chmod、その他のコマンドを介してシステムのセキュリティとリソースの割り当てを保証します。 3。プロセス管理は、PS、Kill、およびその他のコマンドを使用して、システムプロセスを監視および制御します。 4。ネットワーク操作には、Ping、Ifconfig、SSH、およびネットワーク接続を構成および管理するためのその他のコマンドが含まれます。 5.システムの監視とメンテナンスは、TOP、DF、DUなどのコマンドを使用して、システムの動作ステータスとリソースの使用を理解します。

Linuxエイリアスを使用したカスタムコマンドショートカットで生産性を高めますLinuxエイリアスを使用したカスタムコマンドショートカットで生産性を高めますApr 12, 2025 am 11:43 AM

導入 Linuxは、柔軟性と効率性により、開発者、システム管理者、およびパワーユーザーが好む強力なオペレーティングシステムです。しかし、頻繁に長く複雑なコマンドを使用することは退屈でERです

Linuxは実際に何に適していますか?Linuxは実際に何に適していますか?Apr 12, 2025 am 12:20 AM

Linuxは、サーバー、開発環境、埋め込みシステムに適しています。 1.サーバーオペレーティングシステムとして、Linuxは安定して効率的であり、多くの場合、高電流アプリケーションの展開に使用されます。 2。開発環境として、Linuxは効率的なコマンドラインツールとパッケージ管理システムを提供して、開発効率を向上させます。 3.埋め込まれたシステムでは、Linuxは軽量でカスタマイズ可能で、リソースが限られている環境に適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。