仮想メモリに関するいくつかのトピックについて混乱しています。だから、私はそれらを点別にリストし、質問するつもりです. 答えながら、その疑問を解消できるソースもリストしていただければ幸いです。Linux elf 実行可能ファイルを参照して話します。
32 ビット システムでは、すべてのプロセスに 4GB のアドレス空間があると聞いたことがあります。実行可能な再配置可能ファイルの 1 つの objdump を確認したところ、00000000 から ffffffff までの制限があることがわかりました。また、カーネルスペースも含まれていました。これは、ファイルのアドレス空間です。これは私たちが話している仮想メモリですか?はいの場合、仮想メモリメカニズムにより非常に大きなサイズのプロセスを実行でき、そのプロセスサイズはメインメモリサイズによって制限されないことを読んだことがあります(必要なページをオンデマンドでメインメモリに移動できます-デマンドページング)。では、仮想メモリが 4GB しかない場合、プログラムの最大サイズは 4GB に制限されませんか? また、別のファイルの objdump を確認したところ、同じアドレス (つまり、00000000 から ffffffff) がありました。それで、これはどういう意味ですか?これは、私たちのファイルが、開始アドレスが再び追加されるある種の再配置可能ファイルであることを意味しますか(ただし、これは実行可能な再配置可能オブジェクト ファイルであるため、これはばかげているように思えます)。
セグメンテーションが実装されているメモリで、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 までのアドレス空間を持ち、一度に複数のプロセスがメイン メモリに存在できる場合、すべてのプロセスは、線形アドレス空間でセグメントのアドレスを返す独自のセグメント記述子テーブルを持つ必要があります。
- 起動時にオペレーティング システムがメイン メモリにロードされると読みました。では、そのOS と、特定のプロセスのカーネル空間にあるカーネル コードとの違いは何でしょうか? また、すべてのプロセスは、カーネル空間に独自のカーネル コードのコピーを持っていますか?