2012-07-31 16 views
5

Linux 3.4.6 definiuje następujące makra w arch/x86/include/asm/segment.h. Czy ktoś może wyjaśnić, dlaczego makra __USER dodają 3 do zdefiniowanej stałej i dlaczego nie jest to robione dla makr __KERNEL?Definicje segmentów dla Linuxa na x86

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

Odpowiedz

5

Te cztery symbole reprezentują segment descriptors. Dwa najmniej znaczące bity tych deskryptorów zawierają powiązane z nimi privilege level, a trzeci najmniej znaczący bit zawiera typ tablicy deskryptora (GDT lub LDT). To jest jaśniejsza kodem występujący trochę później:

/* 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 

Aby to osiągnąć, wpis tablicy deskryptorów jest mnożona przez 8, który przesuwa go trzy bity w lewo, a następnie OR ed z typem tabeli i przywilejów poziom (za pomocą dodawania):

/* 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) 
Powiązane problemy