導入
コンピューティングにおけるセグメンテーションは、最新のオペレーティング システムで使用される MMU セグメンテーション ユニットによって管理される手法であり、物理メモリ (純粋なセグメンテーションの場合) または仮想メモリ(ページネーションを伴うセグメンテーションの場合) を分割します。開始アドレスとサイズ ( offset ) によって特徴付けられます。

セグメンテーションの有用性
セグメンテーションにより、データとプログラム (他のセグメントの中でも) を論理的に独立したスペースに分離できるため、プログラミング、リンク、プロセス間共有が容易になります。セグメンテーションにより、各セグメントの特権レベルを通じてより強力な保護も提供されます (「 」を参照)。
メモリセグメント
メモリ セグメントは、次の 2 つの値で定義される独立したアドレス空間です。
- 開始アドレス (ベースまたはベースアドレスとも呼ばれます)
- サイズまたはオフセット(リミットまたはオフセットとも呼ばれます)
したがって、セグメントはメインメモリ内の連続したアドレス範囲を構成します。
したがって、必要なデータの論理アドレスは (セグメント、オフセット) の形式で表現され、セグメントは (16 ビット) によって参照され、オフセットは 32 ビットのフィールドで表現されます。
したがって、セグメントは 16 ビットごとにオーバーラップします。したがって、複数のセグメント/オフセットのペアを使用して同じメモリ領域をアドレス指定できます。
例えば :
| セグメント | : | オフセット |
| 00FFAC | : | 000008 |
| 00FFA0 | : | 0000C8 |
| 00FF00 | : | 000AC8 |
| 00F000 | : | 00FAC8 |
| 000000 | : | 0FFAC8 |
セグメントによるアドレス指定からオフセットによるアドレス指定に移行するには、単純に 10h を乗算するだけであることに注意してください。
セグメントの種類
セグメントにはさまざまな種類があります。
- 静的データセグメント
- グローバルデータセグメント
- コードセグメント
- タスク状態セグメント
機能している
MMU が論理アドレスをリニア アドレスに変換する必要がある場合、セグメンテーション ユニットはまずアドレスの最初の部分、つまり を使用して、セグメントの特性 (base、limit、DPL など) を見つける必要があります。記述子テーブル ( GDT またはLDT )。次に、セグメント内のアドレスを参照するオフセット値 (32 ビット上) を使用します。
現在のプロセッサの大部分には、プロセッサによって最後に使用されたセグメント セレクタが含まれ、これらのセレクタへのアクセスを高速化するために使用されるセグメント レジスタ (cs、ds、ss など) があります。
最近のプロセッサでは、各セグメント レジスタに関連付けられたレジスタもあり、記述子へのアクセスを高速化するための関連レジスタが含まれています。

セグメント記述子
セグメント記述子は、セグメントの特性を含む 8 バイトの構造体です。
最も使用されるセグメントの記述子は GDT (グローバル記述子テーブル) で参照され、その他のセグメントはLDT (ローカル記述子テーブル) に配置できます。
セグメント記述子はセグメント セレクターと組み合わせて使用され、論理アドレスをリニア アドレスに変換できるようになります。

セグメント記述子のフィールド
記述子には次のフィールドが含まれます。
- セグメントの最初のバイトのリニア アドレスを含むBase値。
- セグメントの最後のバイトのオフセットを含む制限値。
- アドレスの単位を定義するG フラグ(バイトまたは 4096 バイトの倍数)。
- システムセグメントを定義するかどうかを定義するフラグS。
- セグメントのタイプ (データ、コードなど) を示すTypeフィールド。
- セグメントにアクセスするための最小特権レベルを表すDPLフィールド。
- P フラグにより、セグメントがメイン メモリに存在するかどうかを知ることができます (ページングを参照)。
- セグメントの内容 (データまたはコード) を定義するフィールドDまたはB。
- プログラマが使用できるAVLフィールド。
記述子の使用
セレクターがセグメント レジスター (cs、ds、ss など) にロードされると、関連する記述子がセグメント レジスターに関連付けられたレジスターにロードされます (そこにまだ存在しない場合)。したがって、論理アドレスを線形アドレスに変換する役割を担うセグメンテーション ユニットは、メイン メモリにある記述子のテーブルを毎回参照する必要がありません。
セグメント記述子の例
プログラマがローカル記述子テーブルを使用して挿入できるセグメントに加えて、多くの一般セグメントがあり、そのほとんどすべてがグローバル記述子テーブルで参照されます。
- タスク状態セグメント記述子
- データセグメント記述子
- コードセグメント記述子
