ストレージ ユニット単位で管理するのは明らかに非現実的であるため、Linux では仮想メモリ空間を同じサイズの複数のストレージ パーティションに分割します。 Linux ではこのようなパーティションをページと呼びます。スワップインとスワップアウトを容易にするために、物理メモリはページのサイズに応じて複数のブロックに分割されます。物理メモリ内のブロック空間は仮想メモリ ページのコンテナーであるため、物理メモリ内のブロックはページ フレームと呼ばれます。ページとページ フレームは、Linux が仮想メモリ テクノロジを実装するための基礎です。
仮想メモリページ、物理メモリページフレーム、ページテーブル Linux では、ページとページ フレームのサイズは通常 4KB です。もちろん、ページのサイズやページ フレームはシステムやアプリケーションによって異なる場合があります。 物理メモリと仮想メモリがページ フレームとページに分割された後、それらのストレージ ユニットの元のアドレスは自然に 2 つのセグメントに分割され、これらの 2 つのセグメントはそれぞれ異なる意味を表します。上位のセグメントはページ フレーム コードとページ コードと呼ばれ、ページ フレームとページを識別するためのコードです。下位セグメントはページ フレーム オフセットおよびページ オフセットと呼ばれ、ページ フレームおよびページ内のストレージ ユニットのアドレス コードです。次の図は、仮想メモリと物理メモリの 2 つのセグメントがページングされた後の状況を示しています。 システムが対応するページ フレーム内の仮想メモリ ページのイメージに正しくアクセスするには、ページがページ フレームにマップされるときに、ページ番号とページ イメージを格納するページ フレーム コードをページ テーブルと呼ばれるテーブル エントリに入力する必要があります。このページ テーブルは、前述のマッピング レコード テーブルです。ページ テーブルの概略図を以下に示します。 ページ モードでは、仮想アドレスと物理アドレスの変換関係の概略図は次のようになります。 言い換えると、プロセッサが遭遇するすべてのアドレスは仮想アドレスです。仮想アドレスと物理アドレスはどちらも、ページ番号 (ページ フレーム コード) とオフセット値の 2 つの部分に分かれています。仮想アドレスを物理アドレスに変換するプロセスでは、オフセット値は変更されません。ページ番号とページ フレーム コード間のマッピングは、マッピング レコード テーブル (ページ テーブル) にあります。 ページして交換してください 仮想メモリ ページを物理ページ フレームにマッピングすることをページ ロードと呼びます。 プロセッサが仮想メモリ ページにアクセスしようとすると、まずページ テーブルをチェックして、そのページが物理ページ フレームにマップされているかどうかを確認し、それをページ テーブルに記録します。そうである場合、MMU はページ番号をページ フレーム コードに変換し、仮想アドレスによって提供されるページ オフセットを追加して、物理メモリにアクセスするための物理アドレスを形成します。そうでない場合は、仮想メモリ ページがメモリにロードされていないことを意味します。このとき、MMU はオペレーティング システムにページ アクセス エラー (ページ エラー) が発生したことを通知します。次に、システムはいわゆる「ページ要求」メカニズムを開始します。つまり、対応するシステム操作関数を呼び出して、仮想アドレスが有効なアドレスであるかどうかを判断します。 有効なアドレスの場合、そのアドレスが指すページが仮想メモリからメモリ内の空きページ フレームに読み込まれ、対応するテーブル エントリがページ テーブルに追加されます。プロセッサはページ フォールトが発生した場所から実行を再開します。無効なアドレスの場合、プロセスが存在しない仮想アドレスにアクセスしようとしていることを示し、オペレーティング システムはアクセスを終了します。 もちろん、ページが正常に要求された後、メモリ内に空き物理ページ フレームがない状況もあります。このとき、システムはいわゆるスワップ メカニズムを開始する必要があります。つまり、対応するカーネル操作関数を呼び出して、物理ページ フレーム内で使用されなくなったページまたは近い将来使用されなくなる可能性のあるページが占有しているページ フレームを見つける必要があります。見つかったら、ページは移動され、新しいページが読み込まれます。削除されたページは、次の 2 つの状況に応じて処理されます。ページが変更されていない場合は削除されます。ページが変更された場合、システムはそのページを補助記憶装置に書き戻す必要があります。 システム ページの処理プロセスは次のとおりです。 システムから削除するページを公平に選択するために、Linux システムでは、最近最も使用されていない (LRU) ページ エージング アルゴリズムを使用します。この戦略では、システム内で各ページがアクセスされる頻度に基づいて、物理ページ フレーム内のページに age と呼ばれる属性を設定します。ページが訪問される回数が多いほど、ページの年齢は若くなります。それ以外の場合、ページの年齢は古くなります。古いページは、入れ替えるのに最適な候補です。 クイックテーブル システムが仮想メモリ ページにアクセスするたびに、メモリ内のすべてのページ テーブルでページのページ フレームを検索する必要があり、これは時間のかかるタスクです。しかし、システムが一度ページにアクセスすると、一定期間そのページで安定して動作することが分かっています。したがって、ページ テーブルへのアクセス速度を向上させるために、システムにはページ テーブルを収容できるハードウェア レジスタ セットも装備されています。このようにすると、システムが仮想メモリに再度アクセスするときに、最初にこのハードウェア レジスタ セットにアクセスするため、システム速度が大幅に向上します。現在のページ テーブルを格納するこのレジスタ セットは、キャッシュ テーブルと呼ばれます。 つまり、仮想メモリ テクノロジを使用する場合、プロセッサにはメモリ管理タスクの一部を実行するハードウェアが搭載されている必要があります。メモリ管理を担当するハードウェア部分は、メモリ管理ユニット MMU と呼ばれます。メモリ管理ユニット MMU の動作プロセスを次の図に示します。 ページ共有 マルチプログラム システムでは、複数のプログラムが同じコードまたはデータを共有する必要がある状況がよくあります。ページング管理メモリでは、複数のプログラムが同じページを共有するようにするだけです。 具体的な方法は、ページ テーブルでこれらの関連プログラムの仮想空間のページがメモリ内の同じページ フレームを指すようにします。このように、プログラムが実行されてこれらの関連ページにアクセスすると、同じページ フレーム内のページにアクセスし、ページ フレーム内のページはこれらのプログラムによって共有されます。次の図は、3 つのプログラムがページを共有する例です。 ページ保護 上記から、ページ テーブルは実際には仮想空間から物理空間へのエントリであることがわかります。したがって、ページにアクセスできないプログラムによってページの内容が破壊されるのを防ぐために、ページ テーブル エントリにアクセス制御フィールドをいくつか設定し、対応するページのコンテンツに対して許可される操作を示して不正なアクセスを禁止する必要があります。 次の図は、ページ テーブル エントリに制御情報を格納するための可能な形式を示しています。 注: PCD ビットは、キャッシュが許可されているかどうかを示します。 プログラムがページ制御フィールドで許可されていないページに対して操作を実行しようとすると、オペレーティング システムで割り込み (不正アクセス割り込み) が発生し、操作が拒否されるため、ページの内容が破壊されるのを防ぎます。 マルチレベルページテーブル ページ テーブルは、オペレーティング システムによってメモリ管理のために作成されるテーブルであることに注意することが重要です。したがって、プログラムの実行中は、そのページ テーブルもメモリ空間に格納する必要があります。プログラムに必要なページ テーブルが 1 つだけであれば、これは問題ではありません。しかし、プログラムの仮想空間が非常に大きい場合は、さらに大きな問題が発生します。 たとえば、プログラムの仮想空間が 4GB で、ページ テーブルが 1 ページあたり 4KB の場合、プログラム空間は 1M ページになります。これら 1M ページのページ ポインターを格納するには、このページ テーブルの長さがかなり大きくなり、メモリへの負担も大きくなります。したがって、ページ テーブルもページに格納されます。プログラム実行中は、必要なページのみがメインメモリにコピーされ、一時的に必要のないページは補助メモリに残されます。これらのページ テーブル ページを管理するには、ページ テーブル ヘッダー アドレスを記録するページ ディレクトリ テーブルを確立する必要があり、これにより、単一レベルのページ テーブルが 2 レベルのページ テーブルになります。セカンダリ ページ テーブルのアドレス変換を次の図に示します。 もちろん、プログラムの仮想空間が大きい場合は、3 レベルのページ テーブルを使用して管理することもできます。汎用性を確保するために、Linux システムでは、ページ ディレクトリ (PGD)、ミドル ディレクトリ (PMD)、ページ テーブル (PTE) の 3 レベルのページ テーブル構造を使用します。 Linux ページテーブル構造 普遍性のために、Linux システムでは、ページ ディレクトリ、中間ページ ディレクトリ、ページ テーブルという 3 レベルのページ テーブル構造が使用されます。 PGD は第 1 レベルのページ テーブルであり、pgdt データ型の配列であり、各配列要素は中間ページ ディレクトリを指します。 PMD は第 2 レベルのページ テーブルであり、pmdt データ構造の配列であり、各配列要素はページ テーブルを指します。 PTE はページ テーブルであり、pte_t データ型の配列であり、各要素には物理アドレスが含まれています。 アプリケーションの柔軟性を高めるために、Linux は一連のマクロを使用してさまざまなプラットフォームの詳細をカバーします。ユーザーは、構成ファイル config でニーズに応じてページ テーブルを構成し、3 レベルのページ テーブルを使用するか、2 レベルのページ テーブルを使用するかを決定できます。 システムがコンパイルされると、ディレクトリ include/asm は、構成ファイル config の構成に従って、特定の CPU 専用のファイル ディレクトリにシンボリック リンクされます。たとえば、i386CPU の場合、ディレクトリ シンボルは include/asm-i386 に接続され、セカンダリ ページ テーブルの基本構造は、次に示すように、ファイル pgable-2level-defs.h で定義されます。 また、次のことも定義します。
ページ ディレクトリとページ テーブル エントリのデータ構造は、include/asm-i386/pgtable.h ファイルで次のように定義されています。
定義からわかるように、これらはすべて、1 つの長整数型 (32 ビット) のみを持つ構造体です。 注: 上記の「ページ保護」セクションで述べたように、ページ フレーム コードは物理アドレスを表し、上位 20 ビットのみが必要です (ページ フレームの長さは 4 KB なので、ページ内のオフセットは 12 ビットです)。次の 12 ビットには、さまざまなステータス情報とアクセス権限を保存できます。しかし、Linux ではこれは行われませんでした。代わりに、それを保存するための構造を再定義し、「or」演算によって 2 つを結合しました。 |
<<: TongxinzhiwuはSTEAM教育をリードし、子供たちの創造性の限界を広げます
>>: 「映画とテレビ+ソーシャル」、網易クラウドが「微光」の新たな道を切り開く
多くの場合、人々はコンテンツと外部リンクの最適化に重点を置きすぎています。実際、URL アドレスの最...
パフォーマンスマーケティング当社では、KPI と結果重視のあらゆるプロモーションを「モバイル インタ...
最近、権威ある国際処理性能委員会TPCの公式発表によると、「データベース分析シナリオのエベレスト」と...
ビジネスアプリケーションを作成するプログラマーの多くは、実際の開発で Redis を使用する際に S...
tmhhostの「ダブルイレブン」イベントが始まりました。プロモーション内容には、日本CN2 VPS...
競争相手は変わっており、 Douyuと Huya が以前と同じように競争を続けることはあまり意味があ...
K-ed またはダウングレードされたウェブサイトを回復するにはどうすればよいでしょうか。ほとんどの人...
今日のデータ量が飛躍的に増加しており、したがってインターネットに接続されるデータの量も急速に増加して...
Admin5によると、ウェブマスターは8月29日にSina Weiboのロゴの後ろにある「Beta」...
インターネットでお金を稼ぐのは難しくありません。賢い頭脳があれば、簡単にお金を稼ぐことができます。こ...
linode.com からの最新ニュース: Linode の日本データセンターは大きな成功を収めまし...
2012 年の初めに、Baidu はアルゴリズムに一定の調整を加え始め、サイトの内部要因、特に以前は...
ソフトテキストプロモーションが効果的かどうかを判断する基準は、消費者の注目を集めることができるかどう...
5月7日、Shitouは「Seopasswordは第二のLangyu SEOか?」というタイトルの記...
Racknerd は良いのか?Racknerd はどうなのか?このような疑問には、Racknerd ...