セグメント方式とは、プログラムやデータを目的に応じて可変のサイズでまとめる
メモリ管理方法の一つです。この方式では、情報を属性ごとに分類されたグループ、すなわちセグメントとして管理します。プログラムを実行する際には、特定のセグメントを参照するためにその識別子とオフセットを指定し、メモリ空間にアクセスします。セグメントは、プログラムコンパイル時に生成される
オブジェクトファイル内でも利用され、リンクを経て
実行ファイルが生成されます。
セグメントの活用と仮想記憶
セグメント方式は、主に
仮想記憶システムや
メモリ保護機能を実現するための手段です。メモリ内には「コードセグメント」や「データセグメント」など、プログラムによって異なるセグメントが存在します。これにより、異なるプログラムが同じセグメントを共有することも可能です。
オペレーティングシステムは、必要なプログラムやデータをメモリに読み込む際に、空き領域が不足している場合は不要なセグメントを
補助記憶装置に移動します。
各セグメントはセグメントテーブルによって管理されており、セグメント番号や開始物理アドレスが記録されています。そのため、特定のプログラムやデータの実アドレスはセグメントテーブルから算出されます。ただし、セグメントのサイズが可変であることから、実記憶の連続領域が不足する場合があり、これを
フラグメンテーションと呼びます。
ページ化セグメンテーション
セグメント方式と
ページング方式を組み合わせたページ化セグメンテーションでは、各セグメントが複数のページから構成されます。これにより、セグメントが連続した実メモリに存在する必要がなくなり、外部断片化を防ぐことができます。また、特定のセグメントへのアクセス制限を設定することができ、メモリ使用の効率化が図られます。
この方法は、MULTICSや
ACOS-4で採用されています。
フラットメモリモデルでのセグメンテーション
ページング機能を持つシステムでは、一つの仮想アドレス空間を区切ることでセグメントが実現されることがあります。例えば、
プロセスのコードやデータ、
スタックは各セグメントとして分けられて配置されます。ハードウェアがこのセグメンテーション方式に対応していると、
データ実行防止機能を個々のセグメントに適用できるため、セキュリティ向上にも寄与します。Linuxはこのアプローチを取り入れています。
ハードウェアの実装
セグメンテーションは
メモリ保護の一手段として実装されます。セグメントは通常プログラム上の自然な領域に関連付けられ、それに対する参照はパーミッションによって許可されます。セグメントには、その長さとオフセット、配置情報が含まれており、
オペレーティングシステムがセグメントを主記憶に読み込む際の管理も行います。
歴史的背景
セグメント方式を最初に実装したコンピュータの一つに
バロースB5000があります。このコンピュータは、
仮想記憶をセグメント方式で提供した商用コンピュータの一例です。また、GE-645や
Intel iAPX 432などもセグメント方式の特長を持っています。
さらに、80286からは
プロテクトモードが導入され、より高度な
メモリ保護機能が実現されました。
x86アーキテクチャにおけるセグメンテーション
x86系プロセッサでは、リアルモードと
プロテクトモードで異なるセグメンテーション動作があります。リアルモードでは
メモリ保護は存在せず、単純なセグメントレジスタを使用したアドレッシングが行われます。対して
プロテクトモードでは、セグメントレジスタが
メモリ保護を可能にし、64KiB以上のメモリへのアクセスも滑らかに行うことができます。
このように、セグメント方式は
メモリ管理の重要な手法として、現在もさまざまなシステムで利用されているのです。