セグメント方式
セグメント方式 (memory segmentation)は、メモリ管理の方式の一つ。プログラムやデータをセグメントまたはセクションという「可変な」大きさのまとまりで管理する。セグメントは、メモリ空間上で、情報の属性などによって分類されたグループである。セグメント方式でメモリ位置を参照するには、セグメントを識別する値とセグメント内のオフセットを指定する。セグメントまたはセクションはプログラムをコンパイルした際に生成されるオブジェクトファイルでも使われており、それらがリンクされて実行ファイルが生成され、そのイメージがメモリにロードされる。
セグメントは仮想記憶やメモリ保護機能を実現する方式の一つである。プログラムのモジュール毎やメモリ使用法の異なるクラス毎に「コードセグメント」や「データセグメント」といった各種セグメントが生成される。1つのセグメントを複数のプログラムが共有することもある[1]。
目次 |
仮想記憶におけるセグメント方式 [編集]
オペレーティングシステムは、必要なプログラムやデータを主記憶上に読み込み(ロールイン)、セグメントとして管理する。読み込む際に、空き領域が足りないときは、不要なセグメントを補助記憶装置に退避(ロールアウト)して必要な空き領域をつくる。
各セグメントは、セグメントテーブルで管理され、セグメント番号とセグメントの開始アドレスが保管されている。各セグメントに属するプログラムやデータの実アドレスは、セグメントテーブル内の開始アドレスとそこからの相対アドレスから算出する。
セグメントは、実記憶上に連続した領域として割り当てられる。セグメントの大きさが可変長なため、場合によっては、実記憶上には空き領域の合計が十分あるのに連続領域が空いていないことがある(フラグメンテーション)。
ページ化セグメンテーション (多重仮想記憶) [編集]
セグメント方式とページング方式と組み合わせた方式。この方式では、プログラムコード用、データ用などの各セグメントが複数のページで構成される。これによって、1つのセグメントが連続した実メモリに存在する必要が無く、外部断片化を防ぎ、効率的にメモリを使用することができる。さらに、プログラムコード用のセグメントの書き換えを禁止するといったアクセス制限や、リードオンリーのセグメントをプログラム間で共有することによりメモリ消費を抑えるといったことができる。
ページ化セグメンテーションはMULTICS[2]やACOS-4のメモリ管理に採用されている。
フラットメモリモデルにおけるセグメンテーション [編集]
ページングに対応したシステムにおいても、一つの(仮想)アドレス空間を区切ることでセグメントを実現する場合もある。たとえば、プロセスが使用するコード、データやスタックをそれぞれ、0x1000から0x2000までのコードセグメント、0x2000から0x4000までのデータセグメント、0xe000から0xffffffまでのスタックセグメント、に配置して使うことである。ハードウェアがこうした方式のセグメンテーションに対応していれば、それぞれの領域に対してデータ実行防止のような保護をセグメントごとに行うことができる。
この場合、CPUアーキテクチャの互換性が高くなるが、プロセス間でセグメントを共有するときに、ページテーブルを共有してメモリ使用量を削減するというメリットはなくなる。
Linuxはこの方式を採用している。[3]
ハードウェア実装 [編集]
メモリ保護はメモリ保護を実装する方式の1つである。ページ単位のメモリ保護もあり、両者を組み合わせることもできる。セグメントの大きさは可変であり、最小の場合1バイトとすることもできる[4]。セグメントは通常、ルーチン群やデータテーブル群といったプログラム上の自然な領域に対応しており、プログラマから見えるようになっていることが多い[1]。
セグメントには長さとパーミッションがある。プロセスがあるセグメントを参照しようとしたとき、その参照の種類がパーミッションで許可されていて、その際のオフセットがセグメントの長さの範囲内であるときのみ参照できる。さもなくば、セグメンテーション違反などの例外処理が呼び出される。
セグメントには、それがメモリ上のどこに配置されているかを示す情報も付属している。それは、セグメントの先頭アドレスという場合もあるし、ページ化セグメンテーションならページテーブルのアドレスの場合もある。前者の場合、あるセグメントの範囲内の位置への参照は、セグメント内オフセットをセグメントの先頭位置のアドレスに加算して参照すべきメモリアドレスを算出する、後者の場合はセグメント内オフセットとページテーブルの内容から参照すべきメモリアドレスを算出する。
セグメントには、そのセグメントが主記憶上にあるか否かを示すフラグも付属している。主記憶にないセグメントへの参照が発生すると、オペレーティングシステムが二次記憶装置からそのセグメントの内容を読み込む。
セグメントが対応するページテーブルをもたない場合、セグメントの先頭アドレスは一般に主記憶内のアドレスである。その場合ページングは全く関与しない。Intel 80386 およびそれ以降においては、ページングを使わずにそのようなアドレッシングを行う場合と、ページングを使ってページ化アドレス空間内のアドレッシングを行う場合がある。
メモリ管理ユニット (MMU) は、セグメントとセグメント内オフセットからメモリアドレスを求める処理を行い、そのアクセスが許可されているものかどうかをチェックする役目を担っている。
歴史 [編集]
セグメント方式を実装した初期のコンピュータとしてバロース B5000 があり、セグメント方式で仮想記憶を提供した最初期の商用コンピュータの1つとされている"[5]。このアーキテクチャの改良版は、Unisys ClearPath Libra サーバで2012年現在も使われている。
GE-635 を改造した GE-645 はセグメントとページングを追加サポートしており、1964年の Multics のために設計された。
Intel iAPX 432[6]は1975年に開発が始まったが、マイクロプロセッサ上で真のセグメント・アーキテクチャによるメモリ保護を実装することを意図していた。
プライム、ストラタス、アポロ、インテル/AMDのx86といったコンピュータはいずれもセグメント方式を採用している[7]。
x86アーキテクチャ [編集]
インテル系CPUの8086では、16ビットのアドレスレジスタ(64KBオフセット)とセグメントレジスタの組み合わせにより(後者を4ビット右シフトして加算)、1MBの物理アドレス空間へのアクセスを可能としている。セグメントレジスタにはCS/DS/SS/ESの4つがあり、これは以降のIA-32アーキテクチャやその後継においても拡張されつつ踏襲されている。ただし8086では、セグメントには任意のプログラムが制限なくアクセスでき、セグメントには先頭位置があるだけで、長さはチェックされなかった。
Intel 80286においては、セグメント方式を採用したメモリ管理ユニットが追加され、従来互換のリアルモードとメモリ保護機能が有効となったプロテクトモードという2つの動作モードが搭載された。プロテクトモードではグローバルディスクリプタテーブル(GDT)・ローカルディスクリプタテーブル(LDT)等によるメモリ保護機能が提供された。8086でのセグメントレジスタは、セグメントディスクリプタテーブルを指し示すセグメントセレクタとなった。
Intel 80386ではメモリ管理ユニットにページング方式が追加採用され、アドレスレジスタも32ビット(4GB)に拡張された。ページ化セグメンテーション方式によるメモリ管理もハードウェアとして対応している。
Microsoft Windows の x86-64 版では、GSセグメントレジスタがスレッド単位のデータ構造を指すようになっている。LinuxカーネルではGSがCPU単位のデータを指している。
オブジェクトファイル [編集]
セグメントまたはセクションはオブジェクトファイルでも定義されている。異なるオブジェクトファイルにあるセグメント群は、セグメント定義時に指定されたルールに従ってリンケージエディタによって結合される。複数のオブジェクトファイル間でセグメントを共有する際にも規約があり、例えばDOSではいくつかのメモリーモデルが定義されており、セグメントの使用法や結合法が規定されていた[8]。
脚注 [編集]
- ^ a b Englander, Irv (2003), The architecture of computer hardware and systems software (3rd ed.), Wiley, ISBN 0-471-07325-3
- ^ “The Multics Virtual Memory”. 2012年2月12日閲覧。 5.2 Paging 参照
- ^ 新城 靖. “情報科学類 オペレーティングシステム II 授業内容メモ 「メモリ管理、アドレス空間、ページテーブル」 (筑波大学情報工学研究科)”. 2012年2月12日閲覧。
- ^ Intel Corporation (2012). Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B & 3C): System Programming Guide. pp. 3–13.
- ^ Mayer, Alastair J.W.. “The Architecture of the Burroughs B5000 - 20 Years Later and Still Ahead of the Times?”. 2012年3月15日閲覧。
- ^ Intel Corporation (1981). Introduction to the IAPX 432 Architecture. pp. 78.
- ^ Van Vleck, Thomas. “Multics General Info and FAQ”. 2012年3月18日閲覧。
- ^ Irvine, Kip R. (1993), Assembly language for the IBM-PC (2nd ed.), New York: Macmillan, ISBN 0-02-359651-1
参考文献 [編集]
- Operating Systems: Internals and Design Principles by William Stallings. Publisher: Prentice Hall. ISBN 0-13-147954-7. ISBN 978-0-13-147954-8.