2012-07-31 13 views
5

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

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

答えて

5

これらの4つの記号は、segment descriptorsを表します。これらの記述子の2つの最下位ビットは、それらに関連付けられたprivilege levelを含み、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 

これを実現するために、ディスクリプタ・テーブル・エントリが左に3ビットをシフトする、8乗算され、その後、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) 
関連する問題