セグメント・セレクタ

セグメント・セレクタとは、ディスクリプタ・テーブル上、現在どのディスクリプタを使用しているかを示す「セレクタ値」のことです。セレクタ値は、セグメント・レジスタに格納されます。

 15            3  2 1 0
+---------------+--+---+
|     Index     |TI|RPL|
+---------------+--+---+


上位13bitで、ディスクリプタ・テーブル上の任意のディスクリプタのインデックス値(0,1,2,3,…)を示します。

ディスクリプタ・テーブルのエントリ1個分は8バイトであるので、「8*Index」で、ディスクリプタ・テーブルの先頭アドレスからのオフセット位置を示します。

実際には、セグメント・セレクタ(16bit)の下位3bitをマスクする(AND 0xFFF8)ことで、上記オフセットアドレスを求めることができます。3bitで表現可能な数は「0〜7」なので、下位3bitをマスクすれば8の倍数が表現されるためです。

GDTRに格納されたアドレス(ディスクリプタ・テーブルの先頭アドレス)にセレクタ値を加算することで、ディスクリプタ・テーブル上の任意のセグメント・ディスクリプタの位置を特定するわけです(これで判明するのはセグメントの「属性情報」が記述された位置であり、セグメントそのものの位置ではないことに注意)。

TIは「テーブルインジケータ」です。
 0 … GDTを使用
 1 … LDTを使用

RPLは「要求特権レベル」です。

13ビットのすべてが0の場合、「セグメント・レジスタを無効にする」という意味となります。