9

オペレーティングシステムの研究(主にLinuxを参照)では、私が研究した資料では十分に説明されていない点がいくつかあります。

メモリにロードされたプログラムは、仮想メモリが純粋にページングに基づいているLinuxのようなオペレーティングシステムのコンテキストでも、テキスト、データ、スタックなどのセグメントに分割されていると説明されることがよくあります。セグメント化されたと呼ばれるのはプログラムだけであり、メモリ自体ではないというのは事実ですか?もしそうなら、私は用語が混乱していると思います。

データセグメントのサイズを大きくする「sbrk」という呼び出しを使用して、mallocをLinuxに実装できることを確認しました。繰り返しますが、この「データセグメント」は、「実際の」セグメントではなく、慣例によりデータに使用されるメモリの領域にすぎませんか?(追加の質問:「sbrk」は「セグメント」のサイズを縮小できないようです。これは、プロセスが終了する以外にOSにメモリを解放できないことを意味しますか?)

また、最近のオペレーティングシステムが(ページングされた)セグメンテーションを使用していないように見える理由を知りたいと思います。特定の種類の攻撃を防ぎ、コードを独自の保護されたセグメントに配置して、セキュリティを強化しませんか?一方で、これは例えばJITコンパイルを不可能/困難にするでしょうか?

上記の質問に対する「はい」/「いいえ」の回答に加えて、私はこの主題に関する洞察に満ちた詳細に興味があります。

4

2 に答える 2

5

「データ セグメント」のセグメントは、ハードウェア セグメンテーションとは関係ありません。これは、ページングに依存して仮想メモリを実装する最新のオペレーティング システム (つまり、ページングに関して冗長) とはほとんど関係のない機能です。セグメントには、ページングと比較して重大な欠点もあります (たとえば、セグメント内で連続するメモリは物理的に連続している必要があります)。利点はありません。ユーザー空間プログラムの「セグメント」とは、文字通り、プロセスの仮想空間の連続したセクションを意味します。

多くのアーキテクチャには、もはやセグメンテーションがありません。x86 では、セグメンテーションは単なる履歴ペイロードであり、セグメンテーションをバイパスできないため、アドレス空間全体をカバーするコードおよびデータ セグメントを持つように設定されます。

sbrk で取得したメモリを解放することについての質問は、次のとおりです。sbrk() で取得したメモリを解放するにはどうすればよいですか?

于 2012-02-27T09:44:03.710 に答える