5

Linux 3.4.6 では、arch/x86/include/asm/segment.h で次のマクロが定義されています。__USER マクロが定義された定数に 3 を追加する理由と、これが __KERNEL マクロに対して行われない理由を誰か説明できますか?

#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8)
#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8)
#define __USER_DS   (GDT_ENTRY_DEFAULT_USER_DS*8+3)
#define __USER_CS   (GDT_ENTRY_DEFAULT_USER_CS*8+3)
4

1 に答える 1

6

これらの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

これを実現するために、記述子テーブルエントリにを掛けます。これにより、記述子テーブルエントリが83ビット左にシフトされ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)
于 2012-07-31T08:20:01.260 に答える