これらの4つの記号は、セグメント記述子を表します。これらの記述子の2つの最下位ビットには、それらに関連付けられた特権レベルが含まれ、3番目の最下位ビットには記述子テーブルタイプ(GDTまたはLDT)が含まれます。これは、少し後で発生するコードによって明確になります。
/* User mode is privilege level 3 */
#define USER_RPL 0x3
/* LDT segment has TI set, GDT has it cleared */
#define SEGMENT_LDT 0x4
#define SEGMENT_GDT 0x0
/* Bottom two bits of selector give the ring privilege level */
#define SEGMENT_RPL_MASK 0x3
/* Bit 2 is table indicator (LDT/GDT) */
#define SEGMENT_TI_MASK 0x4
これを実現するために、記述子テーブルエントリにを掛けます。これにより、記述子テーブルエントリが8
3ビット左にシフトされOR
、テーブルタイプと特権レベル(加算を使用)で編集されます。
/* GDT, ring 0 (kernel mode) */
#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8)
/* GDT, ring 3 (user mode) */
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3)