2012-07-31 21 views
5

Linux 3.4.6 definiert die folgenden Makros in arch/x86/include/asm/segment.h. Kann jemand erklären, warum die __USER-Makros 3 zu der definierten Konstante hinzufügen und warum dies nicht für __KERNEL-Makros getan wird?Segmentdefinitionen für Linux auf 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) 

Antwort

5

Diese vier Symbole stehen für segment descriptors. Die zwei niedrigstwertigen Bits dieser Deskriptoren enthalten das ihnen zugeordnete privilege level, und das drittniedrigstwertige Bit enthält den Deskriptortabellentyp (GDT oder LDT). Dies wird klarer durch Code ein wenig später auftreten:

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

Um dies zu erreichen, wird der Deskriptortabelle Eintrag von 8 multipliziert, der es drei Bits nach links verschiebt, und dann OR ed mit dem Tabellentyp und Privileg Füllstand (unter Verwendung von Zusatz):

/* 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) 
Verwandte Themen