セグメント方式

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索

セグメント方式 (memory segmentation)は、メモリ管理の方式の一つ。プログラムデータセグメントという「可変な」大きさのまとまりで管理する。セグメントは、メモリ空間上で、情報の属性などによって分類されたグループである。

仮想記憶メモリ保護機能を実現する方式の一つである。

目次

[編集] 仮想記憶におけるセグメント方式

オペレーティングシステムは、必要なプログラムやデータを主記憶上に読み込み(ロールイン)、セグメントとして管理する。読み込む際に、空き領域が足りないときは、不要なセグメントを補助記憶装置に退避(ロールアウト)して必要な空き領域をつくる。

各セグメントは、セグメントテーブルで管理され、セグメント番号とセグメントの開始アドレスが保管されている。各セグメントに属するプログラムやデータの実アドレスは、セグメントテーブル内の開始アドレスとそこからの相対アドレスから算出する。

セグメントは、実記憶上に連続した領域として割り当てられる。セグメントの大きさが可変長なため、場合によっては、実記憶上には空き領域の合計が十分あるのに連続領域が空いていないことがある(フラグメンテーション)。

[編集] ページ化セグメンテーション (多重仮想記憶)

多重仮想記憶の概念図

セグメント方式とページング方式と組み合わせた方式。この方式では、プログラムコード用、データ用などの各セグメントが複数のページで構成される。これによって、1つのセグメントが連続した実メモリに存在する必要が無く、外部断片化を防ぎ、効率的にメモリを使用することができる。さらに、プログラムコード用のセグメントの書き換えを禁止するといったアクセス制限や、リードオンリーのセグメントをプログラム間で共有することによりメモリ消費を抑えるといったことができる。

ページ化セグメンテーションはMULTICS[1]ACOS-4のメモリ管理に採用されている。

この節は執筆の途中です この節は執筆中です。加筆、訂正して下さる協力者を求めています

[編集] フラットメモリモデルにおけるセグメンテーション

ページングに対応したシステムにおいても、一つの(仮想)アドレス空間を区切ることでセグメントを実現する場合もある。たとえば、プロセスが使用するコードデータスタックをそれぞれ、0x1000から0x2000までのコードセグメント、0x2000から0x4000までのデータセグメント、0xe000から0xffffffまでのスタックセグメント、に配置して使うことである。ハードウェアがこうした方式のセグメンテーションに対応していれば、それぞれの領域に対してデータ実行防止のような保護をセグメントごとに行うことができる。

この場合、CPUアーキテクチャの互換性が高くなるが、プロセス間でセグメントを共有するときに、ページテーブルを共有してメモリ使用量を削減するというメリットはなくなる。

Linuxはこの方式を採用している。[2]

この節は執筆の途中です この節は執筆中です。加筆、訂正して下さる協力者を求めています

[編集] セグメントに対応するハードウェア

インテルCPU8086では、16ビットのアドレスレジスタ(64KBオフセット)とセグメントレジスタの組み合わせにより(後者を4ビット右シフトして加算)、1MBの物理アドレス空間へのアクセスを可能としている。セグメントレジスタにはCS/DS/SS/ESの4つがあり、これは以降のIA-32アーキテクチャやその後継においても拡張されつつ踏襲されている。

Intel 80286においては、セグメント方式を採用したメモリ管理ユニットが搭載され、グローバルディスクリプタテーブル(GDT)・ローカルディスクリプタテーブル(LDT)等によるメモリ保護機能が提供された。8086でのセグメントレジスタは、セグメントディスクリプタテーブルを指し示すセグメントセレクタとなった。

Intel 80386ではメモリ管理ユニットにページング方式が追加採用され、アドレスレジスタも32ビット(4GB)に拡張された。ページ化セグメンテーション方式によるメモリ管理もハードウェアとして対応している。

[編集] 脚注

[ヘルプ]

[編集] 関連項目

個人用ツール
名前空間

変種
操作
案内
ヘルプ
ツールボックス
他の言語