セグメント・ディスクリプタ Edit

目次 Edit

セグメント・ディスクリプタとは Edit

セグメントの情報を記述した8バイトのデータ構造。
セグメントの開始アドレス(セグメント・ベース)、セグメントの大きさ(セグメント・リミット)、属性などが含まれる。

セグメント・ディスクリプタは、GDT及び、LDTに格納することができる。

ちなみに、リミットやベースアドレスが分かれているのは、286との互換性のため。
286では6,7Byte目を使用しない。

セグメント・ディスクリプタの構造 Edit

0x0f0x0e0x0d0x0c0x0b0x0a0x090x080x070x060x050x040x030x020x010x00
Limit[15-0]0x00000x0000
Base[15-0]0x0002
PDPLS:1TypeABase[23-16]0x00040x0004
Base[31-24]GD/B予約AVLLimit[19-16]0x0006

Limit : セグメント・リミット(Byte:0,1,6[bit:0-3]) Edit

セグメントのサイズを指定する。全20bit構成。
グラニュラリティフラグによって、解釈が変わる。

Base : セグメントのベースアドレス(Byte:2-4,7) Edit

セグメントの開始リニアアドレスで、全32bit構成。
ここがこのセグメントの0Byte目になる部分。
ベースアドレスを16Byte境界にアライメントすることで、最大の能力を発揮する。

A : アクセス済みフラグ(Byte:5[bit:0]) Edit

使用率の低いセグメントを探すために利用する、管理用のフラグ。セグメントにアクセスした時に、自動的に1になる。
このビットを定期的に検査することで、使用率をしらべることができる。
このビットは、明示的にクリアしない限り、0にならない。

Type : セグメント・タイプ(Byte:5[bit:1-3]) Edit

3bit構成で、セグメントの種類を指定する。
3bit目でデータ(0)かコード(1)かが決まり、1~2bit目も解釈が変わる。

E : 伸長フラグ
ベースアドレスから下位方向に伸びる。おもにスタックセグメントに使用される。
W : 書き込み可能フラグ
読み取り以外にも書き込みができる。
C : コンフォーミングフラグ
特権レベルが低いコードから呼び出しが行えることを示す。
R : 読み取り可能フラグ
実行以外にも読み取りができる。
データセグメント
3 Data2 E1 W説明
000読み取り専用
001読み取り・書き込み
010読み取り専用・エクスパンドダウン
011読み取り・書き込み・エクスパンドダウン
コードセグメント
3 Code2 C1 R説明
100実行専用
101実行・読み取り
110実行専用・コンフォーミング
111実行・読み取り・コンフォーミング

S : ディスクリプタ・タイプ(Byte:5[bit:4]) Edit

システム・セグメントか、コード、データ・セグメントかを指定する。

DPL : ディスクリプタの特権レベル(Byte:5[bit:5,6]) Edit

セグメントの特権レベルを0~3で指定する。
特権レベルを参照。

P : セグメント存在フラグ(Byte:5[bit:7]) Edit

  • 0:セグメントがメモリ上に存在しないことを表す。
  • 1:セグメントがメモリ上に存在することを表す。

AVL(Available) : 自由利用可(Byte:6[bit:4]) Edit

システムソフトウェアが、何かの用途で自由に使用可能。

D/B : デフォルトサイズ/ビッグ(Byte:6[bit:6]) Edit

  • 0:アドレスやデータを16bitで扱う。
  • 1:アドレスやデータを32bitで扱う。

32ビットのコード、データ・セグメントのときは常に1を設定し、16ビットのコード、データ・セグメントのときは常に0を設定する必要がある。

コードセグメント Edit

デフォルト・サイズ・フラグ。
オペランドやアドレスを処理する、デフォルトのサイズを指定する。

  • 0:16,8bitで処理する。
  • 1:32,8bitで処理する。

このビットを1にセットしたコード・セグメントをCSレジスタに読み込むことで、32ビットに移行することができる。
スタック?を4バイト単位で扱うか2バイト単位で扱うかもこのフラグで決まる。*1

デフォルト以外のビット数(0なら32bit,1なら16bit)を処理する場合、以下の命令プリフィックスを命令の前に置くことで、変えることが可能。

  • 0x66:オペランドに有効
  • 0x67:アドレスに有効
エクスパンドダウン・データ・セグメント Edit
スタック・セグメント(SSレジスタによって指されているデータ・セグメント) Edit

ビッグ・フラグ。
push, pop, callなどの、暗黙のスタック操作に使用されるスタックポインタのサイズを指定する。

  • 0:16bitのスタックポインタ(sp)が使用される。
  • 1:32bitのスタックポインタ(esp)が使用される。

G : グラニュラリティフラグ(Byte:6[bit:7]) Edit

  • 0:セグメント・リミットをバイト単位で解釈する。
  • 1:セグメント・リミットをページ単位(4KiB)で解釈する。

グラニュラリティ(Granularity)は、粒度、細かさなどの意味。

参考・関連 Edit


*1 出典:インテル・マニュアル 中間B:POP

Since 2008 July. OS Project Wiki
リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS