web-dev-qa-db-ja.com

最新のOSはページングとセグメンテーションを使用していますか?

私はメモリアーキテクチャについて読んでいて、ページングとセグメンテーションについて少し混乱しました。最近のOSシステムはページングのみを使用してメモリアクセスを管理していると読みましたが、分解されたコードを見ると、「ds」や「fs」などのセグメントがわかります。 OS(WindowsとLinuxで見た)がセグメンテーションとページングの両方を使用していることを意味しますか、それともすべてのセグメントを同じページにマッピングするだけですか(セグメントを無関係にします)?

25
Dan

Andrew S.Tanenbaumによる本ModernOperating Systems 3rdEditionとOpenSecurity Training(opensecuritytraining.info)の資料に基づいて、セグメンテーションとページングを理解できました。私の質問に対する答えは次のとおりです。

  1. 概念:

    1.1 .セグメンテーション:

    セグメンテーションとは、メモリをセグメントと呼ばれる部分(セクション)に分割することです。これらのセグメントは互いに独立しており、サイズが可変であり、必要に応じて拡大する可能性があります。

    1.2。 仮想メモリ:

    仮想メモリは、実メモリを抽象化したものです。これは、仮想アドレス(プログラムで使用)を物理アドレス(ハードウェアで使用)にマップすることを意味します。プログラムがメモリ2000(moveax、2000)にアクセスしたい場合、仮想アドレス(2000)は実際の物理アドレス(例えば1422)に変換され、次にプログラムは彼がメモリにアクセスしていると考えてメモリ1422にアクセスする。 2000.したがって、仮想メモリがシステムによって使用されている場合、プログラムは実際のメモリに直接アクセスするのではなく、対応する仮想メモリを使用します。

    1.3。 ページング:

    ページングは​​仮想メモリ管理スキームです。前に説明したように、仮想アドレスを物理アドレスにマップします。ページングは​​、仮想メモリを「ページ」と呼ばれる部分に分割し、物理メモリも「フレームページ」と呼ばれる部分に分割します。ページは1つ以上のフレームページにバインドできます(ページは異なるフレームページをマップできますが、一度に1つだけマップできることに注意してください)

  2. 長所と短所

    2.1。 セグメンテーション:

    セグメンテーションを使用する主な利点は、メモリを異なる線形アドレス空間に分割することです。このプログラムを使用すると、コード用、スタック用、動的変数(ヒープ)用などのアドレス空間を持つことができます。セグメンテーションの欠点は、メモリの断片化です。この例を考えてみましょう–メモリの一部は順番に割り当てられた4つのセグメントに分割されます-> seg1(in use) --- seg2(in use)--- seg3(in use)---seg4(in use)。ここで、seg2からメモリを解放すると、-> seg1(in use) --- seg2(FREE)--- seg3(in use)---seg4(in use)になります。一部のデータを割り当てたい場合は、seg2を使用して割り当てることができますが、データのサイズがseg2のサイズよりも大きい場合は、割り当てることができず、スペースが無駄になり、メモリが断片化されます。 。もう1つの問題は、一部のセグメントのサイズが大きくなる可能性があり、このセグメントを小さな断片に「分割」できないため、メモリに完全に割り当てる必要があることです。

    2.1。 ページング:

    ページングを使用する主な利点は、物理メモリを抽象化することです。したがって、プログラム(およびプログラマー)はメモリアドレスを気にする必要がありません。 (仮想)メモリ2000は、2つの異なる物理メモリにマップされるため、2つのプログラムでアクセスできます。また、ハードディスクを使用して、必要なページのみがメモリに割り当てられるようにすることもできます。主な欠点は、ページングが1つの線形アドレス空間のみを使用することです。ページングは​​、仮想メモリを0からすべてのプログラムのアドレス可能な最大値にマップします。ここで、この例を考えてみましょう。仮想メモリ上で「chk1」と「chk2」の2つのチャンクが隣り合っています(chk1はアドレス1000から2000に割り当てられ、chk2は2001から3000に使用されます)。chk1を拡張する必要がある場合は、 OSは、新しいサイズのchk1用にメモリにスペースを空ける必要があります。それが再び発生した場合、OSは同じことを行う必要があります。スペースが見つからない場合は、例外が発生します。この種の操作を管理するためのルーチンは、このメモリの拡大と縮小が長時間発生するため、パフォーマンスに非常に悪影響を及ぼします。

  3. セグメンテーションとページング

    3.1。 なぜ両方を組み合わせるのですか?

    運用システムは、セグメンテーションとページングの両方を組み合わせることができます。どうして?組み合わせると、デメリットなしに両方から最高のものを得ることができるからです。したがって、メモリは多くのセグメントに分割され、それぞれに1つ以上のページがあります。プログラムがメモリアドレスにアクセスしようとすると、最初にOSがコレスポンデントセグメントに移動し、そこでコレスポンデントページが見つかるので、そのページに移動すると、プログラムがアクセスしたいフレームページが見つかります。このアプローチを使用して、OSはメモリをカーネルお​​よびユーザープログラムのセグメントを含むさまざまなセグメントに分割します。これらのセグメントには、さまざまなサイズとアクセス保護機能があります。断片化と「ビッグセグメント」の問題を解決するために、ページングが使用されます。ページングを使用すると、より大きなセグメントがいくつかのページに分割され、必要なページのみがメモリに残ります(必要に応じて、より多くのページをメモリに割り当てることができます)。したがって、基本的に、最新のOSには2つのメモリ抽象化があり、セグメンテーションは「プログラムの処理」に、ページングは​​「物理メモリの管理」に使用されます。

    3.2。 実際にはどのように機能しますか?

    セグメンテーションとページングを実行しているOSは、次の構造になります。

    3.2.1。 セグメントセレクター:

    これは、グローバル/ローカル記述子テーブルのインデックスを表します。これには、記述子テーブルのインデックスを表す3つのフィールド、そのセグメントがグローバルまたはローカル記述子テーブルに存在するかどうかを識別するビット、および特権レベルが含まれています。

    3.2.2。 セグメントレジスタ:

    セグメントセレクタを格納するために使用されるCPUレジスタ。通常(x86マシンでは)少なくともレジスタCS(コードセグメント)とDS(データセグメント)があります。

    3.2.3。 セグメント記述子:

    この構造には、ベースアドレス、サイズ(ページ単位またはバイト単位)、アクセス権限、このセグメントがメモリに存在するかどうかの情報など、セグメントに関するデータが含まれます(すべてのフィールドについて、検索グーグルのセグメント記述子の場合)

    3.2.4。 グローバル/ローカル記述子テーブル:

    いくつかのセグメント記述子を含むテーブル。したがって、この構造はシステムのすべてのセグメント記述子を保持します。テーブルがグローバルの場合、ローカル記述子テーブル記述子、タスク状態セグメント記述子、コールゲート記述子などの他のものを保持できます(これらについてはここでは説明しません。グーグルで検索してください)。テーブルがローカルの場合、(私が知る限り)ユーザー関連のセグメント記述子のみを保持します。

    3.3。 どのように機能しますか?

    したがって、メモリにアクセスするには、最初にプログラムがセグメントにアクセスする必要があります。これを行うには、セグメントセレクターをセグメントレジスタにロードしてから、グローバルディスクリプタテーブルまたはローカルディスクリプタテーブル(セグメントセレクタのフィールドに応じて)をロードします。これが、完全メモリアドレスがSEGMENT REGISTER: ADDRESS , like CS:ADDRESS -> 001B:0044BF7Aである理由です。これで、OSはG/LDTに移動し、(セグメントセレクタのインデックスフィールドを使用して)アクセスしようとしているアドレスのセグメント記述子を見つけます。次に、セグメントが存在するかどうか、保護されているかどうかを確認し、すべて問題がない場合は、(記述子の)「ベースフィールド」に記載されているアドレス+アドレスオフセットに移動します。ページングが有効になっていない場合、システムは実際のメモリに直接入りますが、アドレスにページングがあると、仮想アドレスとして扱われ、ページディレクトリに移動します。ベースアドレス+オフセットは線形アドレスと呼ばれ、ディレクトリ+ページ+オフセットの3つのフィールドとして解釈されます。したがって、ディレクトリページでは、線形アドレスの「ディレクトリ」フィールドで指定されたディレクトリエントリが検索されます。このエントリはページテーブルを指し、線形アドレスのフィールド「ページ」はページを見つけるために使用されます。エントリはフレームページを指し、オフセットはプログラムがアクセスしたい正確なアドレスを見つけるために使用されます。

    3.4。 最新の運用システム

    最新のOSは、セグメンテーションを「使用しません」。カーネルコードセグメント、カーネルデータセグメント、ユーザーコードセグメント、ユーザーデータセグメントの4つのセグメントを使用しているため、引用符で囲まれています。これは、すべてのユーザーのプロセスが同じコードとデータセグメント(つまり同じセグメントセレクター)を持っていることを意味します。セグメントは、ユーザーからカーネルに移行するときにのみ変更されます。したがって、セクション3.3で説明されているすべてのパス。発生しますが、同じセグメントを使用し、ページテーブルはプロセスごとに個別であるため、ページフォールトは発生しにくいです。

これがお役に立てば幸いです。間違いや詳細があれば(私はいくつかの部分で少し一般的でした)、コメントして返信してください。君たちありがとう

Danilo PC

37
Dan

それらはページングをメモリ保護にのみ使用し、他の目的(スレッドローカルデータの保存など)にはセグメンテーションを使用します。

5
user541686