セグメント・セレクタ
セグメント・セレクタとは、ディスクリプタ・テーブル上、現在どのディスクリプタを使用しているかを示す「セレクタ値」のことです。セレクタ値は、セグメント・レジスタに格納されます。
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の場合、「セグメント・レジスタを無効にする」という意味となります。