OS Project Wiki の保存版 ヒデさん・アリスさんほか、OS部のみなさんが書いたものです。
2019年にサイトが消滅しました。当時あった211ページのうち、本文が残っていたのは86ページです。すべては復旧できていません。Common Crawl と Internet Archive に 残っていたものを組み直しています(最終取得 2019-05-24)。
編集・検索・添付などの機能は動きません。表示のみです。

検索

まずは、検索!

Index

人気の20件
最新の20件
2018-12-022018-01-092017-05-072017-04-252016-05-012015-02-242014-01-032013-06-252012-12-302012-12-292012-07-272012-07-162012-02-052012-01-292011-10-012011-09-18

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

目次

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

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

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

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

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

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])

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

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

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

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

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

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

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])

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

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

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

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

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

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

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

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

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

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

コードセグメント

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

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

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

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

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

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

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

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

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

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

参考・関連


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

Since 2008 July. OS Project Wiki
保存 2019-03-19 ・ ページ一覧