1

仮想メモリに関するいくつかのトピックについて混乱しています。だから、私はそれらを点別にリストし、質問するつもりです. 答えながら、その疑問を解消できるソースもリストしていただければ幸いです。Linux elf 実行可能ファイルを参照して話します。

  1. 32 ビット システムでは、すべてのプロセスに 4GB のアドレス空間があると聞いたことがあります。実行可能な再配置可能ファイルの 1 つの objdump を確認したところ、00000000 から ffffffff までの制限があることがわかりました。また、カーネルスペースも含まれていました。これは、ファイルのアドレス空間です。これは私たちが話している仮想メモリですか?はいの場合、仮想メモリメカニズムにより非常に大きなサイズのプロセスを実行でき、そのプロセスサイズはメインメモリサイズによって制限されないことを読んだことがあります(必要なページをオンデマンドでメインメモリに移動できます-デマンドページング)。では、仮想メモリが 4GB しかない場合、プログラムの最大サイズは 4GB に制限されませんか? また、別のファイルの objdump を確認したところ、同じアドレス (つまり、00000000 から ffffffff) がありました。それで、これはどういう意味ですか?これは、私たちのファイルが、開始アドレスが再び追加されるある種の再配置可能ファイルであることを意味しますか(ただし、これは実行可能な再配置可能オブジェクト ファイルであるため、これはばかげているように思えます)。

  2. セグメンテーションが実装されているメモリで、CPUが仮想(論理)アドレスを生成することを読んだことがあります。このアドレスには、セグメント、セグメント内のオフセットの 3 つの部分があります。また、ここで話されているセグメントは、コード、データ、スタックなどです。

    プロセスのアドレス空間では、これらのセグメントは特定の位置から開始して配置されます。では、CPUの仮想アドレスの内容は?生成される仮想アドレスの範囲は 00000000 から ffffffff ですか? はいの場合、仮想アドレスでコンテンツにアクセスするプロセスは次のとおりです。

    The segment part is looked up in the segment descriptor table to find the segment's
    starting address in linear address space. Then the offset is indexed within the segment and
    the resulting address is the linear address. Then, we look up the page table and map the
    address to physical address. If the page is not currently in the main memory, it is 
    brought. 
    

    これは、プロセスが常にメインメモリに完全に存在することはできないという事実から生じます。これは、メモリ全体が 1 つのプロセスだけで占有されるためです(プロセスのアドレス空間自体が 4gb であるため)。

    また、すべてのプロセスが 00000000 から ffffffff までのアドレス空間を持ち、一度に複数のプロセスがメイン メモリに存在できる場合、すべてのプロセスは、線形アドレス空間でセグメントのアドレスを返す独自のセグメント記述子テーブルを持つ必要があります。

  3. 起動時にオペレーティング システムがメイン メモリにロードされると読みました。では、そのOS と、特定のプロセスのカーネル空間にあるカーネル コードとの違いは何でしょうか? また、すべてのプロセスは、カーネル空間に独自のカーネル コードのコピーを持っていますか?
4

1 に答える 1

2

これは非常に自由形式の質問であり、さまざまな用語の多くの混乱した使用法があります。私はあなたの質問のできるだけ多くに対処しようとします、そして役立つかもしれない他のいくつかの有用な情報を提供します。

  1. 「32ビットシステムでは、すべてのプロセスのアドレス空間が4GBであると聞いています。」正確には真実ではありません。すべてのプロセスには、32ビットシステムで3.2GBの最大アドレス可能スペースがあります。これは、このメモリが割り当てられることを意味するものではなく、プロセスが起動するとすぐに割り当てられることはありません。「これは私たちが話している仮想メモリですか?」いいえ。仮想メモリは、プロセスのアドレス可能なスペースとは直接関係ありません。これについては後で詳しく説明します。

  2. 以下で説明する理由により、この質問は実際には意味がありません。ただし、プロセスは潜在的に使用可能なメモリ全体を自動的に割り当てないため、複数のプロセスが一度にメモリにうまく収まることに注意してください。(テキストエディタを開いた直後に4GBのメモリを割り当てた場合、一般的なテキストエディタではありません!)

  3. 私は専門家ではありませんが、すべてのプログラムが実行時にカーネルコードの独自のコピーを持っていることを非常に疑っています。セキュリティとパフォーマンスの問題だけでは、これは非常にありそうもない解決策になります。

だから今、あなたを助けるかもしれないいくつかの定義。

  • 物理メモリは(通常は!)PCのRAMです。プログラムを実行するときにCPUが直接動作するのは、高速な物理メモリです。物理メモリアドレスを指定すると、メモリハードウェア自体に応じてメモリ内の正確な位置が指定されます。
  • 仮想メモリは(通常は!)ハードディスクドライブなどの低速メディア(ページングファイルと呼ばれることが多い)に保存されます。コンピュータでプロセスを実行するためのメモリが不足している場合、通常はアイドル状態またはバックグラウンドのアプリケーションから、現在の物理メモリの内容の一部がページファイルにコピーされます。これにより、物理メモリに空きができ、アクティブなプロセスを実行できるようになります。物理メモリに存在しなくなったプログラムがデータを処理する必要がある場合、そのデータをページファイルから物理メモリに再ロードする必要があります。これにより、スペースを確保するために別のプログラムを物理メモリからページアウトする必要があります。「仮想」メモリと「物理」メモリという用語は、このメモリが実際には存在しないことを強調するために使用されます、しかしそれにもかかわらず、それはコンピュータに利用可能です。仮想メモリの使用はパフォーマンスの点で非常にコストがかかりますが、はるかに大きなサイズをサポートできます。実際、任意の量の仮想メモリを使用できるようにすることは可能ですが、パフォーマンスの低下により、これが特定の制限を超える実用的なソリューションになることはありません。
  • 論理メモリアドレスは、単一のプロセスによって使用されるアドレスであり、物理メモリのどこにプロセスがロードされているかを気にすることなく、プロセスが自身のメモリをアドレス指定できるようにします。00000000to rangefffffffは、プロセスで使用可能な論理範囲であり、これは、プロセス内でメモリを参照するために使用されるアドレスです。カーネルはこれを物理的に変換しますプロセスのメモリの物理オフセット(およびセグメンテーション)に基づいて、実際にコードを実行するときにCPUによって使用されるアドレス。この物理的な場所は、使用可能なメモリスペースのどこにでも配置できます。アプリケーションがページアウトおよびページインされると、アプリケーションの存続期間中に物理的な場所が変更される可能性があります。ただし、アプリケーション自体は、それ自体の論理アドレス空間を参照するだけで済みます。「論理」アドレスと「物理」アドレスという用語は、アドレスが実際のアドレスではなく、関連するメモリのサブセット、つまりプロセス自体のメモリ空間に関連するアドレスであることを強調するために使用されます。

私はこれについての専門家ではありませんが、これがあなたの質問のいくつかを明確にするのに役立つことを願っています。

于 2012-10-15T12:58:02.430 に答える